此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
@TestBean
@TestBean
用于测试类中的非静态字段,以覆盖测试的ApplicationContext
使用工厂方法提供的实例。
关联的工厂方法名称派生自带注释的字段的名称,或
bean name(如果指定)。工厂方法必须是static
,不接受任何参数,并且
具有与要覆盖的 Bean 类型兼容的返回类型。让事情变得更多
显式的,或者如果您更愿意使用不同的名称,则注释允许特定的
要提供的方法名称。
默认情况下,带注释的字段的类型用于搜索要覆盖的候选 Bean。
如果多个候选者匹配,@Qualifier
可以提供以将候选范围缩小为
覆盖。或者,其 Bean 名称与字段名称匹配的候选者将
火柴。
如果相应的 Bean 不存在,则将创建一个 Bean。但是,如果您愿意
要使测试在相应的 Bean 不存在时失败,您可以将enforceOverride
属性设置为true
–例如@TestBean(enforceOverride = true)
.
要使用按名称覆盖而不是按类型覆盖,请指定name
属性
注释的。
限定符(包括字段名称)用于确定单独的 |
用 查看上下文 层次结构与 bean 覆盖有关更多详细信息和示例。 |
对可见性没有限制 因此,此类字段和方法可以是 |
以下示例显示如何使用@TestBean
注解:
-
Java
class OverrideBeanTests {
@TestBean (1)
CustomService customService;
// test case body...
static CustomService customService() { (2)
return new MyFakeCustomService();
}
}
1 | 用类型标记用于覆盖 bean 的字段CustomService . |
2 | 此静态方法的结果将用作实例并注入到字段中。 |
在上面的示例中,我们用类型覆盖了 beanCustomService
.如果超过
存在一个该类型的 bean,名为customService
被考虑。否则
测试将失败,您需要提供某种限定符来识别
哪个CustomService
要覆盖的 bean。
以下示例使用按名称查找,而不是按类型查找:
-
Java
class OverrideBeanTests {
@TestBean(name = "service", methodName = "createCustomService") (1)
CustomService customService;
// test case body...
static CustomService createCustomService() { (2)
return new MyFakeCustomService();
}
}
1 | 用名称标记用于覆盖 bean 的字段service ,并指定
factory 方法名为createCustomService . |
2 | 此静态方法的结果将用作实例并注入到字段中。 |
要找到要调用的工厂方法,Spring 会在其中 或者,可以通过其
语法后面的完全限定方法名称 |
只能覆盖单例 Bean。任何重写非单例 Bean 的尝试 将导致异常。 当覆盖由 |