测试中的 Bean 覆盖
测试中的 Bean 覆盖是指通过注解测试类或测试类中的一个或多个非静态字段,来覆盖测试类 ApplicationContext
中特定 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
properties 文件 中注册了后两个(BeanOverrideContextCustomizerFactory
和 BeanOverrideTestExecutionListener
)的实现。
Bean 覆盖基础设施会在测试类上以及测试类中非静态字段上查找使用 @BeanOverride
进行元注解的注解,并实例化相应的 BeanOverrideProcessor
,该处理器负责创建适当的 BeanOverrideHandler
。
内部的 BeanOverrideBeanFactoryPostProcessor
然后使用 Bean 覆盖处理程序,通过创建、替换或包装 Bean 来修改测试的 ApplicationContext
,具体取决于相应的 BeanOverrideStrategy
:
REPLACE
-
替换 Bean。如果不存在相应的 Bean,则抛出异常。
REPLACE_OR_CREATE
-
如果 Bean 存在则替换。如果不存在相应的 Bean,则创建一个新 Bean。
WRAP
-
检索原始 Bean 并对其进行包装。
只有 单例 Bean 可以被覆盖。任何尝试覆盖非单例 Bean 的行为都会导致异常。
当替换由 |
与 Spring 的自动装配机制(例如, |