测试中的Bean覆盖
在测试中的Bean覆盖是指有能力为一个测试类覆盖
ApplicationContext 中的特定Bean,通过在测试类或测试类中的一个或多个
非静态字段上使用注解来实现这一功能。
此功能旨在作为通过@Bean向DefaultListableBeanFactory
setAllowBeanDefinitionOverriding标志设置为true注册bean做法的一种较低风险的替代方案。 |
Spring TestContext 框架为bean覆盖提供了两套注解。
前者完全依赖于Spring,而后者集则依赖于第三方库 Mockito。
自定义Bean覆盖支持
上述提到的三个注解建立在@BeanOverride元注解及其关联基础设施之上,这允许用户定义自定义的bean覆盖变体。
要实现自定义bean覆盖支持,需要以下内容:
-
带有
@BeanOverride元注解的注解,用于定义要使用的BeanOverrideProcessor -
自定义的
BeanOverrideProcessor实现 -
一个或多个由处理器创建的具体
BeanOverrideHandler实现
Spring TestContext 框架包含以下 API 的实现,这些实现支持 Bean 覆盖,并负责搭建其余的基础设施。
-
a
BeanFactoryPostProcessor -
a
ContextCustomizerFactory -
a
TestExecutionListener
spring-test 模块在其
META-INF/spring.factories
属性文件 中注册了后两者(BeanOverrideContextCustomizerFactory 和 BeanOverrideTestExecutionListener)的实现。
bean覆盖基础设施会在测试类上以及被@BeanOverride元注解标记的测试类中的非静态字段上搜索注解,并实例化相应的BeanOverrideProcessor,该BeanOverrideProcessor负责创建一个合适的BeanOverrideHandler。
内部的BeanOverrideBeanFactoryPostProcessor接着使用bean覆盖处理器来根据相应的BeanOverrideStrategy定义,通过创建、替换或包装beans来改变测试的ApplicationContext:
REPLACE-
替换指定的bean。如果不存在相应的bean,则抛出异常。
REPLACE_OR_CREATE-
如果存在,则替换该bean。如果不存在相应的bean,则创建一个新的bean。
WRAP-
获取原始bean并对其进行包装。
|
在替换非单例bean时,非单例bean将被替换为由相应 当使用 当使用 |
|
与Spring的自动装配机制(例如,解析 通常,bean会通过
|