@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。