小编典典

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

spring

我需要在测试类的单个方法中更改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对我不起作用,因为它是在类/方法执行之后而不是之前运行的,并且无论如何我都需要在运行刷新/重新加载之前执行一行代码。

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


阅读 2236

收藏
2020-04-20

共1个答案

小编典典

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

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

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

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

2020-04-20