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

测试中的 Bean 覆盖

测试中的 Bean 覆盖是指在ApplicationContext对于测试类,通过在 test 类。spring-doc.cadn.net.cn

此功能旨在作为注册做法的风险较小的替代方案 一个 Bean 通过@Bean使用DefaultListableBeanFactory setAllowBeanDefinitionOverridingflag 设置为true.

Spring TestContext 框架为 bean 覆盖提供了两组 Comments。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-testmodule 寄存器后两者的实现 (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 override 实例的单例 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. 或者,用户可以直接在自定义 Comments 中提供 bean 名称。spring-doc.cadn.net.cn

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