spring-boot - SpringJUnit4ClassRunner 测试的配置与 SpringBootTest 冲突

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

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

最近我重构了一个测试,其中我想要一个更小的范围(它是关于 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 成为条件,但这没有用。

最佳答案

原来那些内部配置类不应该用@Configuration 注释。删除注解使得手动 bean 生成仍然有效,并且 componentScan 不再获取配置。

关于spring-boot - SpringJUnit4ClassRunner 测试的配置与 SpringBootTest 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57705827/

相关文章:

php - 如何使用 phpunit api 请求发送 header ?

Spring 测试上下文框架

spring-boot - 部署到独立 Tomcat 时 Spring Boot 应用程序无法正常工作

java - 存储库RestExceptionHandler : object is not a managed entity

java - Spring、JavaConfig、BeanDefinition 和空的 getBeanClassName

iphone - 在 Linux 上的 Safari Mobile 下测试的最佳浏览器?

spring-boot-test - 如何在模块/集成测试中禁用 Spring SQS 处理程序

spring - 如何使用@WebfluxTest测试异常

java - 在 Spring Boot 测试中获取配置属性类 bean

java - 在 Spring Boot 应用程序中使用 redis 创建存储库