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

Java 在Spring配置或测试中排除或取消bean,java,spring,spring-boot,testing,Java,Spring,Spring Boot,Testing,我有一个相当大的Spring启动应用程序,其中有许多配置文件,我想测试它们。我希望能够测试完全配置的应用程序,但是在每个测试中排除单个bean作为良好的阴性控件。例如,我想排除单个WebMvcConfigurerbean,例如CORS过滤器,以测试该配置实际上导致测试通过,而不仅仅是测试编写不好。是否可以在测试初始化期间或通过其他配置排除或覆盖bean?您可以使用@TypeExcludeFilters 我相信您需要编写自己的TypeExcludeFilter实现,但它非常简单。请注意,过滤器仅

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

您可以使用
@TypeExcludeFilters

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

您还可以查看Spring Boot提供的“测试片”:
对于许多切片注释(例如,
@WebMvcTest
),您可以以更具声明性的方式添加包含和排除


如果要排除某些自动配置,可以使用
@ImportAutoConfiguration
注释:

您可以添加一个BeanFactoryPostProcessor,从beanfactory中删除bean(这发生在bean实例化之前)。

您可以在测试类的嵌套的
@TestConfiguration
类中添加这样的后处理器,那么除了您所有的正常配置之外,这个bean只为这个测试类加载


但老实说,这变得非常复杂,这可能是一个迹象,表明您的设计可能会有所改进…

这对我来说不起作用。可能问题是我试图排除在
@SpringApplication
注释的主类中定义和导入的bean,以便在到达过滤器之前由
SpringRunner
初始化bean?是的,可能就是这样。TypeExcludeFilter仅筛选组件扫描的类。你能让你的bean组件被扫描而不是手动导入吗?