我有一个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
禁用一些日志记录(非测试代码需要被这个测试特性所污染,并且创建多个概要文件非常繁琐)
从零开始构建应用程序上下文的其他方法(虽然我实际上想要的是使用我的应用程序配置,但某些片段与某些测试无关)
暂无答案!
目前还没有任何答案,快来回答吧!