@TestBean

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

关联的工厂方法名称派生自带注释的字段名称,或者如果指定,则使用 bean 名称。工厂方法必须为 static,不接受任何参数,并且具有与要覆盖的 bean 类型兼容的返回类型。为了更明确,或者如果你希望使用不同的名称,则注释允许提供特定方法名称。

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

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

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

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

Java
class OverrideBeanTests {
	@TestBean (1)
	private CustomService customService;

	// test case body...

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

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

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

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

	// test case body...

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

Spring 在测试类、测试类层次结构以及 @Nested 测试类的封闭类层次结构中搜索要调用的工厂方法。