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

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

测试中的 Bean 覆盖是指通过注释测试类中的一个或多个字段来覆盖 for 测试类中的特定 bean 的能力。ApplicationContextspring-doc.cn

此功能旨在作为注册做法的风险较小的替代方案 一个 Bean via,其标志设置为 .@BeanDefaultListableBeanFactorysetAllowBeanDefinitionOverridingtrue

Spring TestContext 框架为 bean 覆盖提供了两组 Comments。spring-doc.cn

前者完全依赖于 Spring,而后者则依赖于 Mockito 第三方库。spring-doc.cn

此功能旨在作为注册做法的风险较小的替代方案 一个 Bean via,其标志设置为 .@BeanDefaultListableBeanFactorysetAllowBeanDefinitionOverridingtrue

自定义 Bean 覆盖支持

上面提到的三个注释建立在 meta-annotation 和 关联的基础设施,它允许定义自定义的 bean 覆盖变体。@BeanOverridespring-doc.cn

要创建自定义 bean 覆盖支持,需要满足以下条件:spring-doc.cn

  • 一个 meta-annote 的注解,用于定义要使用的@BeanOverrideBeanOverrideProcessorspring-doc.cn

  • 自定义实现BeanOverrideProcessorspring-doc.cn

  • 处理器提供的一个或多个具体实现OverrideMetadataspring-doc.cn

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

该模块注册了后两者的实现 ( 和 )在其 META-INF/spring.factories 属性文件中spring-testBeanOverrideContextCustomizerFactoryBeanOverrideTestExecutionListenerspring-doc.cn

Bean 覆盖基础设施在测试类中搜索任何元注释的字段 with 并实例化相应的 负责注册适当的 .@BeanOverrideBeanOverrideProcessorOverrideMetadataspring-doc.cn

然后,内部使用该信息来更改 通过注册和替换定义的 bean 定义来进行测试 通过相应的 :BeanOverrideBeanFactoryPostProcessorApplicationContextBeanOverrideStrategyspring-doc.cn

  • REPLACE_DEFINITION:替换 Bean 定义。如果 相应的 bean 定义不存在。spring-doc.cn

  • REPLACE_OR_CREATE_DEFINITION:替换 Bean 定义(如果存在)。创建一个 new bean definition(如果相应的 bean 定义不存在)。spring-doc.cn

  • WRAP_BEAN:检索原始 Bean 实例并包装它。spring-doc.cn

与 Spring 的自动装配机制(例如,字段的解析)相比,TestContext 框架中的 bean 覆盖基础结构具有限制 它可以执行的启发式方法来定位 bean。要么可以计算 要覆盖的 Bean 的名称,或者可以明确地选择它,给定 已批注的字段及其限定批注。@AutowiredBeanOverrideProcessorspring-doc.cn

通常,Bean 由 . 或者,用户可以直接在自定义 Comments 中提供 bean 名称。BeanOverrideFactoryPostProcessorspring-doc.cn

一些实现也可以在内部计算 bean 名称 基于约定或其他高级方法。BeanOverrideProcessorspring-doc.cn

只能覆盖单例 bean。任何覆盖非单一实例 bean 将导致异常。

与 Spring 的自动装配机制(例如,字段的解析)相比,TestContext 框架中的 bean 覆盖基础结构具有限制 它可以执行的启发式方法来定位 bean。要么可以计算 要覆盖的 Bean 的名称,或者可以明确地选择它,给定 已批注的字段及其限定批注。@AutowiredBeanOverrideProcessorspring-doc.cn

通常,Bean 由 . 或者,用户可以直接在自定义 Comments 中提供 bean 名称。BeanOverrideFactoryPostProcessorspring-doc.cn

一些实现也可以在内部计算 bean 名称 基于约定或其他高级方法。BeanOverrideProcessorspring-doc.cn

只能覆盖单例 bean。任何覆盖非单一实例 bean 将导致异常。