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

@MockitoBean@MockitoSpyBean

@MockitoBean@MockitoSpyBean可以在测试类中用于覆盖测试的ApplicationContext使用 Mockito 分别是模拟或间谍。在后一种情况下,早期实例 原始豆子被间谍捕获并包裹起来。spring-doc.cadn.net.cn

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

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

  • 在封闭类中的非静态字段上,对于@Nested测试类或任何类 在类型层次结构或封闭类层次结构中@Nestedtest 类。spring-doc.cadn.net.cn

  • 在测试类或任何超类或实现接口的类型级别 类型层次结构。spring-doc.cadn.net.cn

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

什么时候@MockitoBean@MockitoSpyBean在字段上声明,要模拟或监视的 bean 是从带注释的字段的类型推断出来的。如果ApplicationContext一个@Qualifier可以在字段上声明注释以提供帮助 消歧义。在没有@Qualifier注释,注释的名称 字段将用作回退限定符。或者,您可以显式指定 bean name 通过设置valuename属性。spring-doc.cadn.net.cn

什么时候@MockitoBean@MockitoSpyBean在类型级别声明,bean 的类型 (或 bean)来模拟或间谍必须通过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

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

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

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

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

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

@MockitoSpyBean注释使用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,将创建一个间谍 对于由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 替换为 typeCustomService带有 Mockito 模拟。

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

以下示例使用按名称查找,而不是按类型查找。如果没有豆子 叫service存在,则创建一个。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {

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

	// tests...

}
1 替换名为service带有 Mockito 模拟。

以下内容@SharedMocks注释按类型注册两个模拟,按名称注册一个模拟。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 注册PrintingService模拟名称。

下面演示了如何@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 (可选)注入模拟以存验证它们。
模拟也可以注入到@Configuration类或其他与测试相关的课程 组件中的ApplicationContext以便使用 Mockito 的存根配置它们 蜜蜂属。

@MockitoSpyBean例子

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

@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {

	@MockitoSpyBean (1)
	CustomService customService;

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

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

以下示例使用按名称查找,而不是按类型查找。spring-doc.cadn.net.cn

@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {

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

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

以下内容@SharedSpies注释按类型注册两个间谍,按名称注册一个间谍。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 (可选)注入间谍来存根验证它们。
间谍也可以被注入@Configuration类或其他与测试相关的课程 组件中的ApplicationContext以便使用 Mockito 的存根配置它们 蜜蜂属。