@MockitoBean
and @MockitoSpyBean
在测试类的字段上使用 @MockitoBean
和 @MockitoSpyBean
可以分别使用 Mockito 模拟或间谍覆盖测试的 ApplicationContext 中的 bean。在后者情况下,不会替换原始 bean 定义,而是会捕获并由间谍包装 bean 的一个早期实例。
默认情况下,带注释的字段的类型用于搜索要覆盖的候选 bean 定义。如果多个候选对象匹配,可以提供 @Qualifier
以缩小要覆盖的候选对象范围。或者,匹配字段名称的 bean 定义名称的候选对象将匹配。
为了使用按名称覆盖而不是按类型覆盖,请指定注释的 name
属性。
限定符(包括字段名称)用于确定是否需要创建单独的 ApplicationContext
。如果您使用此功能在多个测试中模拟或监视同一 bean,请务必始终如一地命名该字段,以避免创建不必要的上下文。
每个注释还定义了 Mockito 特定的属性来微调模拟详细信息。
@MockitoBean
注释使用 REPLACE_OR_CREATE_DEFINITION
strategy for test bean overriding。如果不存在匹配的 bean 定义,则动态创建一个新的 bean 定义。
@MockitoSpyBean
注释使用 `WRAP_BEAN`strategy,原始实例包装在 Mockito 特工中。此策略要求存在正好一个候选 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(name = "service") (1) private CustomService customService; // test case body... }
1 | 以 Mockito `mock`替换名称为 `service`的 Bean。 |
如果不存在名为 service
的 bean 定义,则创建该 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(name = "service") (1) private CustomService customService; // test case body... }
1 | 通过 Mockito `spy`包装名称为 `service`的 Bean。 |