SpringJUnit4ClassRunner测试的配置与SpringBootTest冲突

时间:2019-08-29 08:10:02

标签: spring-boot testing spring-boot-test springjunit4classrunner

我的项目中有很多测试都用@SpringBootTest注释,因此加载了SpringBoot上下文。

现在,我最近重构了一个Test,在其中我希望将较小的范围(与camunda有关的过程覆盖范围)改为@RunWith(SpringJUnit4ClassRunner.class)。 因为这意味着不会自动加载上下文,所以我使用静态内部类配置“手动”创建了一些bean。整个测试如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
        ExternalConfiguration.class, MyTest.InternalConfiguration.class
})
public class MyTest{

    @Autowired
    private SomeBean someInternalBean;

    @Configuration
    public static class InternalConfiguration{

        @Bean
        SomeBean someInternalBean() {
            return mock(SomeBean .class);
        }

    }
    //Tests

现在,当我运行该测试时,它运行良好。但是当我运行任何其他测试(那些仍使用@SpringBootTest注释的测试)时,加载ApplicationContext时会遇到问题:

The bean 'someInternalBean', defined in class path resource [.../MyTest$InternalConfiguration.class], could not be registered. A bean with that name has already been defined in file [.../SomeBean.class] and overriding is disabled.

显然,在加载ApplicationContext时会创建一个bean,因为该类使用@Component进行了注释,并且上下文加载器会尝试从我的内部配置中创建另一个bean。

我不能允许bean覆盖,因为我的模拟bean可能会覆盖自动创建的bean(我尝试这样做)。

我该如何规避?我希望我的SpringJUnit4ClassRunner测试及其内部配置不影响其他@SpringBootTest测试。我已经尝试使用@ConditionalOnMissingBean来使配置Bean有条件,但这没有用。

1 个答案:

答案 0 :(得分:1)

结果是,那些内部配置类不应使用@Configuration进行注释。删除注释可以使手动Bean生成仍然有效,并且componentScan不再使用该配置。