Spring ComponentScan excludeFilters 注释在 Spring Boot Test 上下文中不起作用
Posted
技术标签:
【中文标题】Spring ComponentScan excludeFilters 注释在 Spring Boot Test 上下文中不起作用【英文标题】:Spring ComponentScan excludeFilters annotation not working in Spring Boot Test context 【发布时间】:2017-06-10 04:14:59 【问题描述】:我正在使用 Spring Boot 1.4.3.RELEASE 并希望在运行测试时排除某些组件被扫描。
@RunWith(SpringRunner.class)
@SpringBootTest
@ComponentScan(
basePackages = "com.foobar",
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = AmazonKinesisRecordChecker.class, MyAmazonCredentials.class))
public class ApplicationTests
@Test
public void contextLoads()
尽管有过滤器,但当我运行测试时,会加载不需要的组件并且 Spring Boot 崩溃,因为这些类需要 AWS 环境才能正常工作:
2017-01-25 16:02:49.234 ERROR 10514 --- [ main] o.s.boot.SpringApplication : Application startup failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'amazonKinesisRecordChecker' defined in file
问题:如何使过滤器正常工作?
【问题讨论】:
@SpringBootTest(classes=> ) 。文档:docs.spring.io/spring-boot/docs/current/api/org/springframework/… @Barath 你是说只有一种方法可以包含类,但不能在 Spring Boot Test 中排除它们? 不,我不是这么说的,您可以使用 WebMvcTest 排除过滤器 Doc :docs.spring.io/spring-boot/docs/current/api/org/springframework/… 供您参考:***.com/questions/26698071/…@ComponentScan
在测试类上不起作用也没有用。它仅适用于@Configuration
类。除此之外,即使它会被接受,它也不会起作用。由于您的应用程序类上会有一个额外的@ComponentScan
,因此一个会检测到该组件,而另一个则不会。结果相同。
【参考方案1】:
您需要的是,不要排除它们,而是使用@MockBean
模拟它们。如下图
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests
@MockBean
AmazonCredentials amazonCredentials;
@Test
public void contextLoads()
这样你会让 Spring Context 知道你想模拟 AmazonCredentials
bean。有时,排除过滤器有点棘手。
希望这会有所帮助!我很想探索我们是否有其他方法来完成这项工作。
【讨论】:
以上是关于Spring ComponentScan excludeFilters 注释在 Spring Boot Test 上下文中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 中的 @ComponentScan 和 @EnableAutoConfiguration 有啥区别?
Spring SpringBoot启动时 @ComponentScan 排除指定Bean初始化
Spring注解详解:@ComponentScan自动扫描组件使用