Spring:在隔离的集成测试中覆盖bean

时间:2016-08-16 09:16:48

标签: java spring spock

我在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吗?

1 个答案:

答案 0 :(得分:0)

我发现很难理解你的用例。你是否必须初始化整个applicationContext以测试FerrariCar和TeslaCar?你不能孤立地测试它们吗?

如果集成测试是唯一的方法,您可以尝试在@ComponentScan中使用excludeFilters来禁用自动检测测试配置,如https://stackoverflow.com/a/30199808/1553203中所示。然后,您可以使用@ Import / @ ComponentScan为每个Spec / Test添加特定的测试@Configuration。