Ped*_*vao 9 java spring spring-test spring-boot
我有几个集成测试类,它们都从单个类导入配置,该类以特定方式@Configuration创建模拟 bean(出于说明目的,作为构造函数参数传递):externalApitrue
@Configuration
public class TestConfig {
@Bean
@Primary
ExternalApi externalApi() {
return new MockExternalApi(true); // <-- true by default for all test classes
}
}
Run Code Online (Sandbox Code Playgroud)
但对于特定的集成测试类,我需要以不同的方式创建该 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() {...}
}
Run Code Online (Sandbox Code Playgroud)
然而,当一次执行我的所有集成测试类时(maven verify例如,使用 ),所有测试类在这一中断之后执行,这是有效的。由于它们共享相同的上下文,因此似乎在更改该 bean 后,它false对于所有后续测试类也保持更改(即,使用该参数)。我尝试@DirtiesContext在类级别使用修复该问题,以便可以为下一个测试类重新加载上下文,但它不起作用。
有没有办法实现我想要做的事情?
注意:如果我将相同的@TestConfiguration静态内部类添加到所有其他集成测试类中,执行相反的操作,即使用arg 创建externalApibean true,那么它们都可以工作。但我当然不希望这样做。
小智 10
这有效:
配置类:
// @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 {
Run Code Online (Sandbox Code Playgroud)
使用此配置的测试套件:
@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)
Run Code Online (Sandbox Code Playgroud)
公共类 UkvServiceTest {
| 归档时间: |
|
| 查看次数: |
2129 次 |
| 最近记录: |