Spring ComponentScan excludeFilters注释在Spring Boot Test上下文中不起作用

时间:2017-01-25 05:12:04

标签: java spring spring-boot spring-annotations spring-test

我正在使用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 

问题:如何让过滤器正常工作?

1 个答案:

答案 0 :(得分:3)

您需要的是,不是要排除它们,而是使用@MockBean来模拟它们。如下图所示

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
    @MockBean
    AmazonCredentials amazonCredentials;

    @Test
    public void contextLoads() {
    }
}

这样你就可以让Spring Context知道你想要模拟AmazonCredentials bean。有时,排除过滤器有点棘手。

希望这有帮助!如果我们有另一种方法来完成这项工作,我很乐意探索。