当前位置: 首页 > 面试题库 >

重新加载或刷新测试方法中的Spring应用程序上下文?

郗阳德
2023-03-14
问题内容

我需要在测试类的单个方法中更改applicationContext中活动的Spring概要文件,并且由于我使用的是ProfileResolver,因此在刷新竞赛之前,我需要运行一行代码。我尝试了以下方法:

@WebAppConfiguration
@ContextConfiguration(locations = {"/web/WEB-INF/spring.xml"})
@ActiveProfiles(resolver = BaseActiveProfilesResolverTest.class)
public class ControllerTest extends AbstractTestNGSpringContextTests {
    @Test
    public void test() throws Exception {
        codeToSetActiveProfiles(...);
        ((ConfigurableApplicationContext)this.applicationContext).refresh();
        ... tests here ...
        codeToSetActiveProfiles(... back to prior profiles ...);
        ... ideally refresh/reload the context for future tests
    }
}

但是我得到:

java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once

DirtiesContext对我不起作用,因为它是在类/方法执行之后而不是之前运行的,并且无论如何我都需要在运行刷新/重新加载之前执行一行代码。

有什么建议?我试图查看正在运行的侦听器/挂钩,但没有看到明显的位置可插入自己来实现此行为。


问题答案:

从设计ApplicationContext上看,Spring TestContext Framework不明确支持以编程方式刷新。此外,不希望测试方法刷新上下文。

因此,我建议你重新评估对刷新的需求,并考虑其他替代方法,例如在专用的测试类中放置需要一组不同的活动配置文件的测试方法。

总之,仅@ActiveProfiles支持在测试类级别(而不是方法级别)上对测试的活动配置文件进行声明性配置(通过value和profiles属性)和程序化配置(通过resolver属性)。另一种选择是实施ApplicationContextInitializer并通过进行配置@ContextConfiguration(initializers=...)

影响刷新ApplicationContext 之前的唯一其他方法是实现SmartContextLoader或扩展提供的类之一,并通过对其进行配置@ContextConfiguration(loader=...)。例如,AbstractGenericContextLoader.customizeContext()允许一个“自定义GenericApplicationContext由装载机创建后的bean定义都被装入的背景之下,之前的上下文刷新。”



 类似资料:
  • 问题内容: 我有一个包含2个测试的测试类: 当我单独运行测试时,我不会出错,但是当我同时运行所有测试时,会失败。失败是由于某些测试修改了应用程序上下文导致的: 是否可以单独运行此测试?我只想在启动test1时读取所有必需的东西,然后运行测试,然后关闭所有必需的东西。然后启动test2。 问题答案: 您可以在修改应用程序上下文的测试类上使用@DirtiesContext批注。 Java文档 Spri

  • 我刚接触Spring。 到目前为止,在我的应用程序中,每次我需要使用bean时,我都会加载XML。 Application Context上下文=new ClassPathXmlApplication ationContext("Applicationontext.xml"); 因此,在每个需要加载特定bean的类中,我都使用上面的行。 在效率或正确使用方面,我想知道这是否是正确的使用(我怀疑不是

  • 我在Spring Framework上运行了几个集成测试,它们扩展了名为BaseitCase的基类。 ,如下所示: 问题是其中一个测试有几个声明:@mockbean,在执行这个测试的那一刻,Spring会重新创建上下文,随后的测试有时会使用错误的bean(来自为使用@mockbean的测试创建的上下文)。我通过检查bean有不同的hashcode就知道了这一点。 当我使用@EventListene

  • 我在我的src/test/resources路径中创建了一个application-integrationtest.yaml,所以我的测试是针对创建的docker TestContainer运行的。问题是没有加载我的application-integrationtest.yaml。 我正在运行一个SpringBoot2.x应用程序 原因:org.springframework.beans.Bean

  • 问题内容: 我正在使用Java进行项目,因此需要在单击特定按钮后重新加载整个程序。这该怎么做? 问题答案: 尝试 如果仍然无法使用,请在完成上述步骤后尝试

  • 我是刚到爪哇的。我正在尝试用click事件重新加载Jpanel。我试过repaint()但没有用。我有以下代码:mainview.java 公共类MainView扩展了javax.swing.jframe{viewPanel p1; 事先谢谢你