我在Spring(使用Spock)的集成测试中覆盖bean时遇到问题。
让我们说这是我的应用程序配置:
@EnableWebMvc
@SpringBootApplication
@Configuration
class Main {
@Bean
Race race(Car car) {
// ...
}
@Bean
Car car() {
// ...
}
}
我有两个独立的集成测试,我希望将它们分开提供Car
实现。
@Slf4j
@SpringApplicationConfiguration
class OneIntegrationSpec extends AbstractIntegrationSpec {
@Configuration
@Import(Main.class)
static class Config {
@Bean
Car oneTestCar() {
return new FerrariCar();
}
}
}
@Slf4j
@SpringApplicationConfiguration
class OtherIntegrationSpec extends AbstractIntegrationSpec {
@Configuration
@Import(Main.class)
static class Config {
@Bean
Car otherTestCar() {
return new TeslaCar();
}
}
}
当我运行其中一个时,我得到:NoUniqueBeanDefinitionException
因为Spring检测到有多个汽车实现。
如何使用Config
注释仅为特定测试加载测试内部类@Configuration
?
我看到@Profile
的方法,但这意味着为每个IntegrationSpec
创建单独的配置文件名称,这有点违反DRY。还有另一种方法而不是@ActiveProfiles
吗?
答案 0 :(得分:0)
我发现很难理解你的用例。你是否必须初始化整个applicationContext以测试FerrariCar和TeslaCar?你不能孤立地测试它们吗?
如果集成测试是唯一的方法,您可以尝试在@ComponentScan中使用excludeFilters来禁用自动检测测试配置,如https://stackoverflow.com/a/30199808/1553203中所示。然后,您可以使用@ Import / @ ComponentScan为每个Spec / Test添加特定的测试@Configuration。