@MockitoBean
和 @MockitoSpyBean
@MockitoBean
和 @MockitoSpyBean
用于测试类中的字段,以分别使用 Mockito 的模拟或间谍对象来覆盖测试的ApplicationContext
中的 Bean。在后一种情况下,将捕获原始 Bean 的早期实例并将其包装在间谍对象中。
默认情况下,使用带注解的字段的类型来搜索要覆盖的候选 Bean。如果多个候选对象匹配,则可以提供@Qualifier
来缩小要覆盖的候选对象范围。或者,Bean 名称与字段名称匹配的候选对象将匹配。
使用@MockitoBean
时,如果不存在相应的 Bean,则会创建一个新的 Bean。但是,如果您希望在不存在相应的 Bean 时测试失败,您可以将enforceOverride
属性设置为true
——例如,@MockitoBean(enforceOverride = true)
。
要使用按名称覆盖而不是按类型覆盖,请指定注解的name
属性。
限定符(包括字段名称)用于确定是否需要创建单独的 |
每个注解还定义了 Mockito 特定的属性来微调模拟细节。
默认情况下,@MockitoBean
注解使用REPLACE_OR_CREATE
测试 Bean 覆盖策略。如果不存在匹配的 Bean,则会动态创建一个新的 Bean。如前所述,您可以通过将enforceOverride
属性设置为true
来切换到REPLACE
策略。
@MockitoSpyBean
注解使用WRAP
策略,原始实例将被包装在 Mockito 间谍对象中。此策略要求存在且仅存在一个候选 Bean。
只能覆盖单例 Bean。任何尝试覆盖非单例 Bean 的行为都会导致异常。 当使用 当使用 |
以下示例展示了如何使用@MockitoBean
注解的默认行为
-
Java
class OverrideBeanTests {
@MockitoBean (1)
private CustomService customService;
// test case body...
}
1 | 用 Mockito 的mock 对象替换类型为CustomService 的 Bean。 |
在上面的示例中,我们为CustomService
创建了一个模拟对象。如果存在多种该类型的 Bean,则会考虑名为customService
的 Bean。否则,测试将失败,您需要提供某种限定符来标识要覆盖的CustomService
Bean。如果不存在这样的 Bean,则将使用自动生成的 Bean 名称创建一个 Bean 定义。
以下示例使用按名称查找,而不是按类型查找
-
Java
class OverrideBeanTests {
@MockitoBean("service") (1)
private CustomService customService;
// test case body...
}
1 | 用 Mockito 的mock 对象替换名为service 的 Bean。 |
如果不存在名为service
的 Bean 定义,则会创建一个。
以下示例展示了如何使用@MockitoSpyBean
注解的默认行为
-
Java
class OverrideBeanTests {
@MockitoSpyBean (1)
private CustomService customService;
// test case body...
}
1 | 用 Mockito 的spy 对象包装类型为CustomService 的 Bean。 |
在上面的示例中,我们包装了类型为CustomService
的 Bean。如果存在多种该类型的 Bean,则会考虑名为customService
的 Bean。否则,测试将失败,您需要提供某种限定符来标识要监视的CustomService
Bean。
以下示例使用按名称查找,而不是按类型查找
-
Java
class OverrideBeanTests {
@MockitoSpyBean("service") (1)
private CustomService customService;
// test case body...
}
1 | 用 Mockito 的spy 对象包装名为service 的 Bean。 |