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 上下文中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ComponentScan注解的扫描范围及源码解析

Spring Boot 中的 @ComponentScan 和 @EnableAutoConfiguration 有啥区别?

Spring SpringBoot启动时 @ComponentScan 排除指定Bean初始化

Spring注解详解:@ComponentScan自动扫描组件使用

Spring使用ComponentScan扫描Maven多模块工程的其它模块

Spring解析@ComponentScan注解的执行流程