@TestBean

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

关联的工厂方法名称派生自带注释的字段的名称,或者 bean 名称(如果指定)。工厂方法必须是static、不接受任何参数以及 具有与要覆盖的 bean 的类型兼容的返回类型。让事情变得更精彩 explicit 的 API 调用,或者如果您更愿意使用不同的名称,则注解允许使用特定的 method 名称。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

要使用 by-name 覆盖而不是 by-type 覆盖,请指定name属性 的注释。spring-doc.cadn.net.cn

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

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

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

	// test case body...

	private static CustomService customService() { (2)
		return new MyFakeCustomService();
	}
}
1 标记一个字段以使用 type 覆盖 beanCustomService.
2 此 static 方法的结果将用作实例并注入到字段中。

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

以下示例使用 by-name 查找,而不是 by-type 查找:spring-doc.cadn.net.cn

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

	// test case body...

	private static CustomService createCustomService() { (2)
		return new MyFakeCustomService();
	}
}
1 标记一个字段以使用 name 覆盖 beanservice,并指定 factory 方法被命名为createCustomService.
2 此 static 方法的结果将用作实例并注入到字段中。

Spring 在 test 类的 test 类中搜索要在 test 类中调用的工厂方法 层次结构,并在@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将被替换 ,其中单例 bean 对应于从@TestBean厂 方法。spring-doc.cadn.net.cn