此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

测试中的 Bean 覆盖

测试中的 Bean 覆盖是指在ApplicationContext对于测试类,通过注释测试类或一个或多个 非静态字段。spring-doc.cadn.net.cn

此功能旨在作为注册实践的风险较低的替代方案 A 豆过孔@Bean使用DefaultListableBeanFactory setAllowBeanDefinitionOverridingflag 设置为true.

Spring TestContext框架提供了两组用于bean重写的注释。spring-doc.cadn.net.cn

前者纯粹依赖于 Spring,而后者则依赖于 Mockito 第三方库。spring-doc.cadn.net.cn

自定义 Bean 覆盖支持

上面提到的三个注释建立在@BeanOverridemeta-annotation 和 关联的基础架构,允许定义自定义 Bean 覆盖变体。spring-doc.cadn.net.cn

要实现自定义 Bean 覆盖支持,需要满足以下条件:spring-doc.cadn.net.cn

Spring TestContext 框架包括以下 API 的实现,这些 API 支持 bean 覆盖,并负责设置其余的基础设施。spring-doc.cadn.net.cn

spring-test模块寄存器后两者的实现 (BeanOverrideContextCustomizerFactoryBeanOverrideTestExecutionListener) 在其META-INF/spring.factories属性文件.spring-doc.cadn.net.cn

覆盖基础架构的 bean 搜索测试类的注释以及 测试类中非静态字段的注释,这些字段被元注释@BeanOverride并实例化相应的BeanOverrideProcessor这是 负责创建适当的BeanOverrideHandler.spring-doc.cadn.net.cn

内部BeanOverrideBeanFactoryPostProcessor然后使用 bean 覆盖处理程序来 更改测试的ApplicationContext通过创建、替换或包装 bean 作为 由相应的BeanOverrideStrategy:spring-doc.cadn.net.cn

REPLACE

替换 bean。如果相应的 bean 不存在,则抛出异常。spring-doc.cadn.net.cn

REPLACE_OR_CREATE

替换 bean(如果存在)。如果相应的 Bean 没有创建新 Bean 存在。spring-doc.cadn.net.cn

WRAP

检索原始 bean 并将其包装。spring-doc.cadn.net.cn

只能覆盖单例 Bean。任何重写非单例 Bean 的尝试 将导致异常。spring-doc.cadn.net.cn

替换由FactoryBeanFactoryBean本身将是 替换为与 Bean 覆盖实例相对应的单例 Bean 替换为 适用BeanOverrideHandler.spring-doc.cadn.net.cn

当包装由FactoryBean,则由FactoryBean将被包装,而不是FactoryBean本身。spring-doc.cadn.net.cn

与 Spring 的自动布线机制(例如,分辨率@Autowired字段),TestContext 框架中覆盖的 bean 基础设施有限 它可以执行启发式方法来定位 bean。要么是BeanOverrideProcessor可以计算 要覆盖的 Bean 的名称,或者可以明确选择它,给定 带注释的字段及其限定注释。spring-doc.cadn.net.cn

通常,bean 由BeanOverrideFactoryPostProcessor. 或者,用户可以直接在自定义注释中提供 bean 名称。spring-doc.cadn.net.cn

BeanOverrideProcessor实现还可以在内部计算基于 约定或其他方法。spring-doc.cadn.net.cn