@TestBean
@TestBean
用于测试类中的非静态字段上,以使用工厂方法提供的实例覆盖测试的 ApplicationContext
中的特定 bean。
关联的工厂方法名称派生自带注解字段的名称,如果指定了 bean 名称则使用 bean 名称。工厂方法必须是 static
的,不接受任何参数,并且返回类型必须与要覆盖的 bean 的类型兼容。为了更明确,或者如果你更喜欢使用不同的名称,该注解允许提供一个特定的方法名称。
默认情况下,带注解字段的类型用于搜索要覆盖的候选 bean。如果多个候选 bean 匹配,可以提供 @Qualifier
来缩小要覆盖的候选 bean 范围。或者,如果候选 bean 的名称与字段名称匹配,也会匹配。
如果对应的 bean 不存在,将会创建一个 bean。但是,如果你希望在对应的 bean 不存在时测试失败,可以将 enforceOverride
属性设置为 true
,例如 @TestBean(enforceOverride = true)
。
要使用按名称覆盖而不是按类型覆盖,请指定该注解的 name
属性。
Qualifier(包括字段名称)用于确定是否需要创建一个单独的 |
将 有关更多详细信息和示例,请参阅带有 bean 覆盖的上下文层级结构。 |
对 因此,此类字段和方法可以是 |
以下示例展示了如何使用 @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。否则,测试将失败,你需要提供某种 qualifier 来标识要覆盖哪个 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 会搜索声明了 或者,可以通过其完全限定方法名称引用外部类中的工厂方法,语法为 |
只有 singleton bean 可以被覆盖。任何覆盖非 singleton bean 的尝试都将导致异常。 覆盖由 |