此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.6spring-doc.cadn.net.cn

@MockitoBean@MockitoSpyBean

@MockitoBean@MockitoSpyBean可以在测试类中用于覆盖测试的ApplicationContext替换为 Mockito mockspy。在后一种情况下, 原始 Bean 被间谍捕获并包装。spring-doc.cadn.net.cn

可以通过以下方式应用批注。spring-doc.cadn.net.cn

  • 在 test 类或其任何超类中的非静态字段上。spring-doc.cadn.net.cn

  • 在封闭类中的非静态字段上@Nestedtest 类或任何类 在类型层次结构中,或者将类层次结构包含在@Nestedtest 类。spring-doc.cadn.net.cn

  • 在测试类的类型级别,或者 type hierarchy 的 test 类。spring-doc.cadn.net.cn

  • 在 incovering 的封闭类的类型级别上@Nestedtest 类或任何类或 接口,或者将类层次结构包含在@Nested测试 类。spring-doc.cadn.net.cn

什么时候@MockitoBean@MockitoSpyBean在字段上声明的,则 bean to mock 或 spy 是从带注释的字段的类型推断的。如果ApplicationContext一个@Qualifierannotation 可以在 field 上声明以帮助 消除歧义。在没有@Qualifierannotation 中,已注释的 field 将用作 fallback 限定符。或者,您可以显式指定 bean 名称设置为 mock 或 spy,方法是将valuename属性。spring-doc.cadn.net.cn

什么时候@MockitoBean@MockitoSpyBean在类型级别声明,则 Bean 的类型 (或 bean)提供给 mock 或 spy 的types注释中的属性 – 例如@MockitoBean(types = {OrderService.class, UserService.class}).如果多个 候选者存在于ApplicationContext中,您可以显式指定一个 bean 名称 mock 或 spy,方法是将name属性。但是请注意,types属性 必须包含单个类型(如果显式 Beanname已配置 – 例如,@MockitoBean(name = "ps1", types = PrintingService.class).spring-doc.cadn.net.cn

为了支持重用 mock 配置,@MockitoBean@MockitoSpyBean可能使用 作为元注释来创建自定义组合注释 —— 例如,定义 单个注解中的常见 mock 或 spy 配置,可在测试中重复使用 套房。@MockitoBean@MockitoSpyBean也可以用作 类型级别 — 例如,按名称模拟或侦测多个 bean。spring-doc.cadn.net.cn

限定符(包括字段的名称)用于确定单独的ApplicationContext需要创建。如果您使用此功能进行 mock 或 spy 同一个 bean 在多个测试类中,请确保一致地命名字段以避免 创建不必要的上下文。spring-doc.cadn.net.cn

@MockitoBean@MockitoSpyBean@ContextHierarchy能 导致不良结果,因为每个@MockitoBean@MockitoSpyBean将是 默认情况下,应用于所有 Context 层次结构级别。为了确保特定的@MockitoBean@MockitoSpyBean应用于单个上下文层次结构级别,则设置 这contextName属性来匹配配置的@ContextConfigurationname – 用于 例@MockitoBean(contextName = "app-config")@MockitoSpyBean(contextName = "app-config").spring-doc.cadn.net.cn

查看上下文 层次结构与 Bean 覆盖,以获取更多详细信息和示例。spring-doc.cadn.net.cn

每个 annotation 还定义了特定于 Mockito 的属性,以微调模拟行为。spring-doc.cadn.net.cn

@MockitoBeanannotation 使用REPLACE_OR_CREATE 策略。 如果相应的 bean 不存在,则将创建一个新的 bean。但是,您可以 切换到REPLACE策略,方法是将enforceOverride属性设置为true– 例如@MockitoBean(enforceOverride = true).spring-doc.cadn.net.cn

@MockitoSpyBeanannotation 使用WRAP 策略, 原始实例包装在 Mockito 间谍中。此策略要求 只存在一个候选 bean。spring-doc.cadn.net.cn

只能覆盖单例 bean。任何覆盖非单例 bean 的尝试 将导致异常。spring-doc.cadn.net.cn

使用@MockitoBean要模拟由FactoryBeanFactoryBean将替换为由FactoryBean.spring-doc.cadn.net.cn

使用@MockitoSpyBean要为FactoryBean,将创建一个 Spy 对于由FactoryBean,而不是FactoryBean本身。spring-doc.cadn.net.cn

@MockitoBean@MockitoSpyBean领域。spring-doc.cadn.net.cn

因此,此类字段可以是public,protected、package-private(默认可见性)、 或private取决于项目的需要或编码实践。spring-doc.cadn.net.cn

@MockitoBean例子

以下示例演示如何使用@MockitoBean注解。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {

	@MockitoBean (1)
	CustomService customService;

	// tests...
}
1 将 bean 替换为类型CustomService带有 Mockito 模拟。

在上面的示例中,我们正在为CustomService.如果有多个 bean 的 Bean 中,名为customService被考虑。否则,测试 将失败,并且您需要提供某种限定符来识别哪个CustomServicebean 的 bean 中。如果不存在这样的 bean,则 bean 将为 使用自动生成的 Bean 名称创建。spring-doc.cadn.net.cn

以下示例使用 by-name 查找,而不是 by-type 查找。如果没有 bean 叫service存在,则创建一个。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {

	@MockitoBean("service") (1)
	CustomService customService;

	// tests...

}
1 将名为service带有 Mockito 模拟。

以下内容@SharedMocksannotation 注册两个 mock by-type 和一个 mock by-name。spring-doc.cadn.net.cn

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MockitoBean(types = {OrderService.class, UserService.class}) (1)
@MockitoBean(name = "ps1", types = PrintingService.class) (2)
public @interface SharedMocks {
}
1 注册OrderServiceUserService按类型模拟。
2 注册PrintingServicemock by-name 的 Mock 名称。

下面演示了如何作@SharedMocks可用于测试类。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
@SharedMocks (1)
class BeanOverrideTests {

	@Autowired OrderService orderService; (2)

	@Autowired UserService userService; (2)

	@Autowired PrintingService ps1; (2)

	// Inject other components that rely on the mocks.

	@Test
	void testThatDependsOnMocks() {
		// ...
	}
}
1 通过自定义@SharedMocks注解。
2 (可选)将 mock 注入 stub验证它们。
mock 也可以注入到@Configuration类或其他与测试相关的 组件ApplicationContext以便使用 Mockito 的存根配置它们 蜜蜂属。

@MockitoSpyBean例子

以下示例演示如何使用@MockitoSpyBean注解。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {

	@MockitoSpyBean (1)
	CustomService customService;

	// tests...
}
1 用 type 包装 beanCustomService与 Mockito 间谍。

在上面的示例中,我们使用 typeCustomService.如果超过 存在一个该类型的 bean,则名为customService被考虑。否则 测试将失败,您需要提供某种限定符来识别 哪个CustomServicebean 的 bean 进行监视。spring-doc.cadn.net.cn

以下示例使用 by-name 查找,而不是 by-type 查找。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {

	@MockitoSpyBean("service") (1)
	CustomService customService;

	// tests...
}
1 包装名为service与 Mockito 间谍。

以下内容@SharedSpiesannotation 按类型注册两个 Spy 和一个按名称注册 Spy。spring-doc.cadn.net.cn

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MockitoSpyBean(types = {OrderService.class, UserService.class}) (1)
@MockitoSpyBean(name = "ps1", types = PrintingService.class) (2)
public @interface SharedSpies {
}
1 注册OrderServiceUserService按类型划分的间谍。
2 注册PrintingService间谍别名。

下面演示了如何作@SharedSpies可用于测试类。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
@SharedSpies (1)
class BeanOverrideTests {

	@Autowired OrderService orderService; (2)

	@Autowired UserService userService; (2)

	@Autowired PrintingService ps1; (2)

	// Inject other components that rely on the spies.

	@Test
	void testThatDependsOnMocks() {
		// ...
	}
}
1 通过自定义@SharedSpies注解。
2 (可选)将 spies 注入 stub验证它们。
间谍也可以注入@Configuration类或其他与测试相关的 组件ApplicationContext以便使用 Mockito 的存根配置它们 蜜蜂属。