Spring@TestConfiguration影响其他测试类



我有几个集成测试类,它们都从一个@Configuration类导入配置,该类以特定的方式创建externalApi模拟bean(出于说明目的,将true作为构造函数参数传递(:

@Configuration
public class TestConfig {

@Bean
@Primary
ExternalApi externalApi() {
return new MockExternalApi(true); // <-- true by default for all test classes
}
}

但对于特定的集成测试类,我需要以不同的方式创建该bean(比如将false作为构造函数参数传递(。为了做到这一点,我尝试在静态内部类中使用@TestConfiguration,如下所示:

@RunWith(SpringRunner.class)
@SpringBootTest("spring.main.allow-bean-definition-overriding=true")
@Import(TestConfig.class)
@ActiveProfiles("test")
public class ExampleIT {
@TestConfiguration
public static class ExternalApiConfig {
@Bean
@Primary
ExternalApi externalApi() {
return new MockExternalApi(false); // <-- false for this particular test class
}
}
@Test
public void someTest() {...}
}

然而,当同时执行我的所有集成测试类时(例如,使用maven verify(,所有测试类都会在这一次中断后执行,这是可行的。由于它们共享相同的上下文,因此在更改该bean之后,对于所有后续的测试类,它似乎也会保持更改(即,使用false参数(。我试图在类级别使用@DirtiesContext来解决这个问题,这样就可以为下一个测试类重新加载上下文,但没有成功。

有没有办法实现我想要做的事情?

注意:如果我将相同的@TestConfiguration静态内部类添加到所有其他集成测试类中,执行相反的操作,即使用truearg创建externalApibean,那么它们都可以工作。但我当然不希望不得不那样做。

这是有效的:

配置类别:

// @TestConfiguration
// Put this class in a separate file
// NB! Do not annotate this class with @TestConfiguration,
// or else the configuration will be propagated to other tests!
public class UkvServiceTestContextConfiguration {

使用此配置的测试套件:

@RunWith(SpringRunner.class)
// NB! Do not use a nested static configuration class, use an external configuration class.
// Nested static configuration class gets propagated to other tests!
@Import(UkvServiceTestContextConfiguration.class)

公共类UvServiceTest{

看起来就像Spring runner中的一个bug;不应传播@TestConfiguration。作为一种解决方法,请尝试将@DirtiesContext添加到测试中以强制刷新。

相关内容

  • 没有找到相关文章

最新更新