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