@TestBean

@TestBean 用于测试类中的非静态字段,通过工厂方法提供的实例覆盖测试的 ApplicationContext 中的特定 bean。

相关的工厂方法名称来源于带注解字段的名称,或者在指定时来源于 bean 名称。工厂方法必须是 static,不接受任何参数,并且返回类型必须与要覆盖的 bean 的类型兼容。为了使其更明确,或者如果你想使用不同的名称,该注解允许提供特定的方法名称。

默认情况下,带注解字段的类型用于搜索要覆盖的候选 bean。如果有多个候选 bean 匹配,可以提供 @Qualifier 来缩小要覆盖的候选范围。或者,bean 名称与字段名称匹配的候选 bean 将匹配。

如果不存在相应的 bean,则将创建一个 bean。但是,如果你希望在相应的 bean 不存在时测试失败,可以将 enforceOverride 属性设置为 true,例如 @TestBean(enforceOverride = true)

要使用按名称覆盖而不是按类型覆盖,请指定注解的 name 属性。

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

@TestBean@ContextHierarchy 结合使用可能会导致不良结果,因为默认情况下每个 @TestBean 将应用于所有上下文层次级别。为确保特定的 @TestBean 应用于单个上下文层次级别,请将 contextName 属性设置为与配置的 @ContextConfiguration 名称匹配,例如 @TestBean(contextName = "app-config")

有关更多详细信息和示例,请参阅 使用 bean 覆盖的上下文层次结构

@TestBean 字段或工厂方法的可见性没有限制。

因此,这些字段和方法可以是 publicprotected、包私有(默认可见性)或 private,具体取决于项目的需求或编码实践。

以下示例展示了如何使用 @TestBean 注解的默认行为

  • Java

class OverrideBeanTests {
	@TestBean (1)
	CustomService customService;

	// test case body...

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

在上面的示例中,我们正在覆盖类型为 CustomService 的 bean。如果存在多个该类型的 bean,则会考虑名为 customService 的 bean。否则,测试将失败,你将需要提供某种限定符来标识要覆盖的 CustomService bean。

以下示例使用按名称查找,而不是按类型查找

  • Java

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

	// test case body...

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

要查找要调用的工厂方法,Spring 会在声明 @TestBean 字段的类中、其超类之一或任何已实现的接口中进行搜索。如果 @TestBean 字段声明在 @Nested 测试类中,也将搜索封闭类层次结构。

或者,可以通过其完全限定方法名引用外部类中的工厂方法,遵循语法 <fully-qualified class name>#<method name>,例如 methodName = "org.example.TestUtils#createCustomService"

当覆盖非单例 bean 时,非单例 bean 将替换为与 @TestBean 工厂方法返回的值对应的单例 bean,并且相应的 bean 定义将转换为 singleton。因此,如果 @TestBean 用于覆盖 prototype 或作用域 bean,则被覆盖的 bean 将被视为 singleton

类似地,当覆盖由 FactoryBean 创建的 bean 时,FactoryBean 将被替换为与 @TestBean 工厂方法返回的值对应的单例 bean。

© . This site is unofficial and not affiliated with VMware.