@MockitoBean@MockitoSpyBean

@MockitoBean@MockitoSpyBean 用于测试类中的字段,以分别使用 Mockito 的模拟间谍对象来覆盖测试的ApplicationContext中的 Bean。在后一种情况下,将捕获原始 Bean 的早期实例并将其包装在间谍对象中。

默认情况下,使用带注解的字段的类型来搜索要覆盖的候选 Bean。如果多个候选对象匹配,则可以提供@Qualifier来缩小要覆盖的候选对象范围。或者,Bean 名称与字段名称匹配的候选对象将匹配。

使用@MockitoBean时,如果不存在相应的 Bean,则会创建一个新的 Bean。但是,如果您希望在不存在相应的 Bean 时测试失败,您可以将enforceOverride属性设置为true——例如,@MockitoBean(enforceOverride = true)

要使用按名称覆盖而不是按类型覆盖,请指定注解的name属性。

限定符(包括字段名称)用于确定是否需要创建单独的ApplicationContext。如果您使用此功能在多个测试中模拟或监视同一个 Bean,请确保始终为字段命名以避免创建不必要的上下文。

每个注解还定义了 Mockito 特定的属性来微调模拟细节。

默认情况下,@MockitoBean注解使用REPLACE_OR_CREATE 测试 Bean 覆盖策略。如果不存在匹配的 Bean,则会动态创建一个新的 Bean。如前所述,您可以通过将enforceOverride属性设置为true来切换到REPLACE策略。

@MockitoSpyBean注解使用WRAP 策略,原始实例将被包装在 Mockito 间谍对象中。此策略要求存在且仅存在一个候选 Bean。

只能覆盖单例 Bean。任何尝试覆盖非单例 Bean 的行为都会导致异常。

当使用@MockitoBean模拟由FactoryBean创建的 Bean 时,FactoryBean将被创建该FactoryBean对象类型实例的单例模拟对象所替换。

当使用@MockitoSpyBeanFactoryBean创建间谍对象时,将为FactoryBean创建的对象创建间谍对象,而不是为FactoryBean本身创建。

以下示例展示了如何使用@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。