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

@TestBean

@TestBean用于测试类中的非静态字段,以覆盖测试的ApplicationContext使用工厂方法提供的实例。spring-doc.cadn.net.cn

关联的工厂方法名称派生自带注释的字段的名称,或 bean name(如果指定)。工厂方法必须是static,不接受任何参数,并且 具有与要覆盖的 Bean 类型兼容的返回类型。让事情变得更多 显式的,或者如果您更愿意使用不同的名称,则注释允许特定的 要提供的方法名称。spring-doc.cadn.net.cn

默认情况下,带注释的字段的类型用于搜索要覆盖的候选 Bean。 如果多个候选者匹配,@Qualifier可以提供以将候选范围缩小为 覆盖。或者,其 Bean 名称与字段名称匹配的候选者将 火柴。spring-doc.cadn.net.cn

如果相应的 Bean 不存在,则将创建一个 Bean。但是,如果您愿意 要使测试在相应的 Bean 不存在时失败,您可以将enforceOverride属性设置为true–例如@TestBean(enforceOverride = true).spring-doc.cadn.net.cn

要使用按名称覆盖而不是按类型覆盖,请指定name属性 注释的。spring-doc.cadn.net.cn

限定符(包括字段名称)用于确定单独的ApplicationContext需要创建。如果使用此功能覆盖 相同的 bean 在多个测试中,请确保一致地命名字段以避免创建 不必要的上下文。spring-doc.cadn.net.cn

@TestBean结合@ContextHierarchy可能导致不良结果 由于每个@TestBean将默认应用于所有上下文层次结构级别。自 确保特定的@TestBean应用于单个上下文层次结构级别,将 这contextName属性以匹配已配置的@ContextConfigurationname – 对于 例@TestBean(contextName = "app-config").spring-doc.cadn.net.cn

对可见性没有限制@TestBean字段或工厂方法。spring-doc.cadn.net.cn

因此,此类字段和方法可以是public,protected, package-private(默认 可见性),或private取决于项目的需求或编码实践。spring-doc.cadn.net.cn

以下示例显示如何使用@TestBean注解:spring-doc.cadn.net.cn

class OverrideBeanTests {
	@TestBean (1)
	CustomService customService;

	// test case body...

	static CustomService customService() { (2)
		return new MyFakeCustomService();
	}
}
1 用类型标记用于覆盖 bean 的字段CustomService.
2 此静态方法的结果将用作实例并注入到字段中。

在上面的示例中,我们用类型覆盖了 beanCustomService.如果超过 存在一个该类型的 bean,名为customService被考虑。否则 测试将失败,您需要提供某种限定符来识别 哪个CustomService要覆盖的 bean。spring-doc.cadn.net.cn

以下示例使用按名称查找,而不是按类型查找:spring-doc.cadn.net.cn

class OverrideBeanTests {
	@TestBean(name = "service", methodName = "createCustomService") (1)
	CustomService customService;

	// test case body...

	static CustomService createCustomService() { (2)
		return new MyFakeCustomService();
	}
}
1 用名称标记用于覆盖 bean 的字段service,并指定 factory 方法名为createCustomService.
2 此静态方法的结果将用作实例并注入到字段中。

要找到要调用的工厂方法,Spring 会在其中@TestBeanfield 在其超类之一或任何实现的 接口。如果@TestBean字段在@Nestedtest 类,则包含 还将搜索类层次结构。spring-doc.cadn.net.cn

或者,可以通过其 语法后面的完全限定方法名称<fully-qualified class name>#<method name>–例如methodName = "org.example.TestUtils#createCustomService".spring-doc.cadn.net.cn

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

当覆盖由FactoryBeanFactoryBean将被替换 使用与从@TestBean厂 方法。spring-doc.cadn.net.cn