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