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

Jav*_*ide 8 java spring spring-test spring-annotations spring-boot

我正在使用 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() {
    }

}
Run Code Online (Sandbox Code Playgroud)

尽管有过滤器,当我运行测试时,不需要的组件被加载并且 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 
Run Code Online (Sandbox Code Playgroud)

问题:如何使过滤器工作?

dag*_*gra 5

您需要的是,不要排除它们,而是使用@MockBean. 如下所示

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

    @Test
    public void contextLoads() {
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您将让 Spring Context 知道您想要模拟AmazonCredentialsbean。有时,排除过滤器使用起来有点棘手。

希望这可以帮助!我很想探索我们是否有其他方法来完成这项工作。