Spring @TestConfiguration 影响其他测试类

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 {


chr*_*ke- 1

看起来像是 Spring 运行程序中的一个错误;@TestConfiguration不应该被传播。作为解决方法,请尝试添加@DirtiesContext到测试中以强制刷新。