测试中的 Bean 覆盖
测试中的 Bean 覆盖(Bean overriding)是指通过在测试类上添加注解,或在测试类中一个或多个非静态字段上添加注解,来覆盖 ApplicationContext 中特定的 Bean。
此功能旨在作为一种风险较低的替代方案,用于取代通过 @Bean 注册 bean 并将 DefaultListableBeanFactory 的 setAllowBeanDefinitionOverriding 标志设置为 true 的做法。 |
Spring TestContext 框架提供了两组用于覆盖 Bean 的注解。
前者完全依赖于 Spring,而后者则依赖于 Mockito 第三方库。
自定义 Bean 覆盖支持
上述三种注解均基于 @BeanOverride 元注解及其相关基础设施,允许用户定义自定义的 Bean 覆盖变体。
要实现自定义的 Bean 覆盖支持,需要以下内容:
-
一个使用
@BeanOverride进行元注解的注解,用于定义要使用的BeanOverrideProcessor -
一个自定义的
BeanOverrideProcessor实现 -
由处理器创建的一个或多个具体的
BeanOverrideHandler实现
Spring TestContext 框架包含以下 API 的实现,这些实现支持 Bean 覆盖,并负责设置其余的基础设施。
-
a
BeanFactoryPostProcessor -
a
ContextCustomizerFactory -
a
TestExecutionListener
spring-test 模块在其 META-INF/spring.factories 属性文件 中注册了后两种实现(BeanOverrideContextCustomizerFactory 和 BeanOverrideTestExecutionListener)。
bean 覆盖基础设施会搜索测试类上的注解,以及测试类中被 @BeanOverride 元注解标注的非静态字段上的注解,并实例化相应的 BeanOverrideProcessor,该处理器负责创建合适的 BeanOverrideHandler。
内部的 BeanOverrideBeanFactoryPostProcessor 随后会使用 Bean 覆盖处理器,根据相应的 ApplicationContext 所定义的方式,通过创建、替换或包装 Bean 来修改测试的 BeanOverrideStrategy:
REPLACE-
替换该 bean。如果对应的 bean 不存在,则抛出异常。
REPLACE_OR_CREATE-
如果 Bean 已存在,则替换它;如果不存在对应的 Bean,则创建一个新的 Bean。
WRAP-
获取原始的 Bean 并对其进行包装。
|
当替换一个非单例(non-singleton)Bean时,该非单例Bean将被替换为由相应的 当替换由 当对由 |
|
与 Spring 的自动装配机制(例如解析 通常,该 bean 由
|