为测试覆盖基于Java的Spring Context配置

spi*_*ike 9 configuration spring config

是否有可能从Spring配置中替换单个bean或值进行一个或多个集成测试?

就我而言,我有配置

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"foo.bar"})
public class MyIntegrationTestConfig {
    // everything done by component scan
}
Run Code Online (Sandbox Code Playgroud)

哪个用于我的集成测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyIntegrationTestConfig.class, loader = SpringApplicationContextLoader.class)
public class MyIntegrationTest {
    // do the tests
}
Run Code Online (Sandbox Code Playgroud)

现在我想要进行第二组集成测试,其中我用一个不同的bean替换一个bean.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyIntegrationTestConfig.class, loader = SpringApplicationContextLoader.class)
public class MySpecialIntegrationTest {
    // influence the context configuration such that a bean different from the primary is loaded

    // do the tests using the 'overwritten' bean
}
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最简单方法是什么?

nob*_*beh 10

Spring测试框架能够理解扩展配置.这意味着你只需要扩展MySpecialIntegrationTest来自MyIntegrationTest:

@ContextConfiguration(classes = MySpecialIntegrationTestConfig.class, loader = SpringApplicationContextLoader.class)
public class MySpecialIntegrationTest extends MyIntegrationTest {

  @Configuration
  public static class MySpecialIntegrationTestConfig {
    @Bean
    public MyBean theBean() {}
  }

}
Run Code Online (Sandbox Code Playgroud)

并创建必要的Java Config类并提供它@ContextConfiguration.Spring将加载基础并将其扩展为您专门用于扩展测试用例的基础.

有关进一步的讨论,请参阅官方文档.