java—在运行JUnit5测试时,如何重写spring组件扫描?

hi3rlvi2  于 2021-07-16  发布在  Java
关注(0)|答案(0)|浏览(256)

我有一个junit 5测试:

@SpringBootTest
public class MyTest {
   ...
}

应用程序默认配置加载许多 @Component@Service 的和 @Configuration 的。
对于一些测试,我想告诉在这个junit测试上下文中运行的spring应用程序不要扫描所有组件,并过滤掉一些重载或冗长/垃圾邮件的组件,这些组件在(模拟的)环境中运行时可能会抱怨,在这种环境中,并不能满足所有的要求。
我试着向提供@componentscan注解 MyTest 以下面的表格上课。我特意添加了多个过滤器和多个过滤类型,希望在应用程序上下文中加载/注册的bean更少:

@ComponentScan(
    useDefaultFilters = false,
    excludeFilters = {
        @Filter(type = FilterType.ANNOTATION, classes = {
            org.springframework.context.annotation.Configuration.class,
            org.springframework.stereotype.Service.class,
            org.springframework.stereotype.Component.class
        }),
        @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {
            MyRabbitMqListener.class
        })
    }
)
@SpringBootTest
public class MyTest {

    @Autowired
    private ApplicationContext context;

    @Test
    public void expectingLessRegisteredBeans() {
        List<String> beans = Arrays.stream(context.getBeanDefinitionNames())
               // ...
               .collect(Collectors.toList());
        assertEquals(beans.size(), ...);
    }

}

不管我提供给 @CompoenntScan ,我无法控制junit5spring测试上下文中扫描/注册的bean的数量。
但我还是想用 @SpringBootTest 以获取我的应用程序的大部分配置,但排除其中的某些部分(因为它们速度慢,或者日志中有垃圾邮件,或者只是抛出错误)。例如,从kafka、rabbitmq或rest等输入接收事件的应用程序会处理它们并将它们保存到持久层。我想测试处理和持久性集成。我向处理器抛出一堆测试事件 @Service 然后期望通过 @Repository .
我的备选方案是:
为@springboottest提供一个我想要加载的类的白名单(不是优雅的,乏味的)
定义几个spring配置文件,在组件上放置条件注解,并在测试代码中只激活/停用我需要的那些,还使用不同的配置文件 application-*.properties 禁用一些日志记录(非测试代码需要被这个测试特性所污染,并且创建多个概要文件非常繁琐)
从零开始构建应用程序上下文的其他方法(虽然我实际上想要的是使用我的应用程序配置,但某些片段与某些测试无关)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题