在Spring配置或测试中排除或取消bean

时间:2018-06-05 20:23:12

标签: java spring spring-boot testing

我有一个相当大的Spring Boot应用程序,其中包含许多我想测试的配置文件。我希望能够测试完全配置的应用程序,但在每个测试中排除单个bean作为良好的阴性对照。例如,我想排除单个WebMvcConfigurer bean,例如CORS过滤器,以测试该配置实际上是否导致测试通过,而不仅仅是测试编写不佳。是否可以在测试初始化​​期间或通过其他配置排除或覆盖bean?

2 个答案:

答案 0 :(得分:0)

您可以使用@TypeExcludeFilters添加注释 https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/api/org/springframework/boot/test/autoconfigure/filter/TypeExcludeFilters.html

我相信你需要编写自己的TypeExcludeFilter实现,但它非常简单。请注意,过滤器仅应用于组件扫描的Bean(不是自动配置Bean)

您还可以查看Spring Boot提供的“测试切片”:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-tests
对于许多切片注释(例如@WebMvcTest),您可以以更具说明性的方式添加包含和排除。

如果您要排除某些自动配置,可以使用@ImportAutoConfiguration注释:https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/ImportAutoConfiguration.html

答案 1 :(得分:0)

你可以添加一个BeanFactoryPostProcessor来从beanfactory中删除bean(这会在bean被实例化之前发生)。
https://docs.spring.io/spring-framework/docs/5.0.6.RELEASE/javadoc-api/org/springframework/beans/factory/config/BeanFactoryPostProcessor.html

您可以在测试类的嵌套@TestConfiguration类中添加此类后处理器,然后除了所有正常配置之外,此bean仅为此测试类加载。

但说实话,这变得非常复杂,这可能表明你的设计可能会以某种方式得到改善......