此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
测试中的 Bean 覆盖
测试中的 Bean 覆盖是指在ApplicationContext
对于测试类,通过在
test 类。
此功能旨在作为注册做法的风险较小的替代方案
一个 Bean 通过@Bean 使用DefaultListableBeanFactory
setAllowBeanDefinitionOverriding flag 设置为true . |
Spring TestContext 框架为 bean 覆盖提供了两组 Comments。
前者完全依赖于 Spring,而后者则依赖于 Mockito 第三方库。
自定义 Bean 覆盖支持
上面提到的三个注释建立在@BeanOverride
meta-annotation 和
关联的基础设施,它允许定义自定义的 bean 覆盖变体。
要实现自定义 bean 覆盖支持,需要满足以下条件:
-
带有
@BeanOverride
,它定义了BeanOverrideProcessor
使用 -
自定义
BeanOverrideProcessor
实现 -
一个或多个混凝土
BeanOverrideHandler
处理器创建的 implementations created by the processor
Spring TestContext 框架包括以下 API 的实现,这些 API 支持 Bean 覆盖,并负责设置其余的基础设施。
-
一个
BeanFactoryPostProcessor
-
一个
ContextCustomizerFactory
-
一个
TestExecutionListener
这spring-test
module 寄存器后两者的实现
(BeanOverrideContextCustomizerFactory
和BeanOverrideTestExecutionListener
) 在其META-INF/spring.factories
属性文件.
Bean 覆盖基础结构在测试类中搜索任何非静态字段
使用@BeanOverride
并实例化相应的BeanOverrideProcessor
负责创建适当的BeanOverrideHandler
.
内部的BeanOverrideBeanFactoryPostProcessor
然后使用 Bean 覆盖处理程序
更改测试的ApplicationContext
通过将 bean 创建、替换或包装为
由相应的BeanOverrideStrategy
:
REPLACE
-
替换 Bean。如果相应的 Bean 不存在,则引发异常。
REPLACE_OR_CREATE
-
如果 Bean 存在,则替换它。如果相应的 Bean 没有,则创建一个新的 Bean 存在。
WRAP
-
检索原始 Bean 并将其包装。
只能覆盖单例 bean。任何覆盖非单例 bean 的尝试 将导致异常。 替换由 包装由 |
与 Spring 的自动装配机制相比(例如,将 通常,bean 是由
|