测试中的 Bean 覆盖
测试中的 Bean 覆盖是指通过注释测试类中的一个或多个字段来覆盖 for 测试类中的特定 bean 的能力。ApplicationContext
此功能旨在作为注册做法的风险较小的替代方案
一个 Bean via,其标志设置为 .@Bean DefaultListableBeanFactory setAllowBeanDefinitionOverriding true |
Spring TestContext 框架为 bean 覆盖提供了两组 Comments。
前者完全依赖于 Spring,而后者则依赖于 Mockito 第三方库。
自定义 Bean 覆盖支持
上面提到的三个注释建立在 meta-annotation 和
关联的基础设施,它允许定义自定义的 bean 覆盖变体。@BeanOverride
要实现自定义 bean 覆盖支持,需要满足以下条件:
-
一个 meta-annote 的注解,用于定义要使用的
@BeanOverride
BeanOverrideProcessor
-
自定义实现
BeanOverrideProcessor
-
处理器创建的一个或多个具体实现
BeanOverrideHandler
Spring TestContext 框架包括以下 API 的实现,这些 API 支持 Bean 覆盖,并负责设置其余的基础设施。
-
一个
BeanFactoryPostProcessor
-
一个
ContextCustomizerFactory
-
一个
TestExecutionListener
该模块注册了后两者的实现
( 和 )在其 META-INF/spring.factories
属性文件中。spring-test
BeanOverrideContextCustomizerFactory
BeanOverrideTestExecutionListener
Bean 覆盖基础设施在测试类中搜索任何元注释的字段
with 并实例化相应的
负责创建适当的 .@BeanOverride
BeanOverrideProcessor
BeanOverrideHandler
然后,内部使用 bean override 处理程序来
通过创建、替换 bean 或将 bean 包装为
由相应的 定义 :BeanOverrideBeanFactoryPostProcessor
ApplicationContext
BeanOverrideStrategy
REPLACE
-
替换 Bean。如果相应的 Bean 不存在,则引发异常。
REPLACE_OR_CREATE
-
如果 Bean 存在,则替换它。如果相应的 Bean 没有,则创建一个新的 Bean 存在。
WRAP
-
检索原始 Bean 并将其包装。
只能覆盖单例 bean。任何覆盖非单例 bean 的尝试 将导致异常。 当替换由 创建的 bean 时,本身将是
替换为对应于 bean override 实例的单例 bean,该实例由
适用。 当包装由 创建的 bean 时,由 创建的对象将被包装,而不是 本身。 |
与 Spring 的自动装配机制(例如,字段的解析)相比,TestContext 框架中的 bean 覆盖基础结构具有限制
它可以执行的启发式方法来定位 bean。要么可以计算
要覆盖的 Bean 的名称,或者可以明确地选择它,给定
已批注的字段及其限定批注。 通常,bean 是由 “按类型” 选择的。
或者,用户可以直接在自定义 Comments 中提供 bean 名称。
|