此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
测试中的 Bean 覆盖
测试中的 Bean 覆盖是指在ApplicationContext
对于测试类,通过注释测试类或一个或多个
非静态字段。
此功能旨在作为注册实践的风险较低的替代方案
A 豆过孔@Bean 使用DefaultListableBeanFactory
setAllowBeanDefinitionOverriding flag 设置为true . |
Spring TestContext框架提供了两组用于bean重写的注释。
前者纯粹依赖于 Spring,而后者则依赖于 Mockito 第三方库。
自定义 Bean 覆盖支持
上面提到的三个注释建立在@BeanOverride
meta-annotation 和
关联的基础架构,允许定义自定义 Bean 覆盖变体。
要实现自定义 Bean 覆盖支持,需要满足以下条件:
-
元注释
@BeanOverride
定义BeanOverrideProcessor
使用 -
一个定制
BeanOverrideProcessor
实现 -
一个或多个混凝土
BeanOverrideHandler
处理器创建的实现
Spring TestContext 框架包括以下 API 的实现,这些 API 支持 bean 覆盖,并负责设置其余的基础设施。
-
一个
BeanFactoryPostProcessor
-
一个
ContextCustomizerFactory
-
一个
TestExecutionListener
这spring-test
模块寄存器后两者的实现
(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 由
|