@TestBean
@TestBean
用于测试类中的字段,以覆盖测试的ApplicationContext
替换为工厂方法提供的实例。
关联的工厂方法名称派生自带注释的字段的名称,或者
bean 名称(如果指定)。工厂方法必须是static
、不接受任何参数以及
具有与要覆盖的 bean 的类型兼容的返回类型。让事情变得更精彩
explicit 的 API 调用,或者如果您更愿意使用不同的名称,则注解允许使用特定的
method 名称。
默认情况下,带注释的字段的类型用于搜索要覆盖的候选 bean。
如果多个候选项匹配,则@Qualifier
可以将候选者缩小到
覆盖。或者,bean 名称与字段名称匹配的候选者将
火柴。
如果相应的 bean 不存在,则将创建一个 bean。但是,如果您愿意
为了在相应的 bean 不存在时测试失败,你可以设置enforceOverride
属性设置为true
–例如@TestBean(enforceOverride = true)
.
要使用 by-name 覆盖而不是 by-type 覆盖,请指定name
属性
的注释。
限定符(包括字段的名称)用于确定单独的 |
以下示例演示如何使用@TestBean
注解:
-
Java
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
被考虑。否则
测试将失败,您需要提供某种限定符来识别
哪个CustomService
bean 的 bean 中。
以下示例使用 by-name 查找,而不是 by-type 查找:
-
Java
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 类中调用的工厂方法
层次结构,并在 或者,外部类中的工厂方法可以通过其
语法后面的完全限定方法名称 |
只能覆盖单例 bean。任何覆盖非单例 bean 的尝试 将导致异常。 当覆盖由 |