@MockitoBean和@MockitoSpyBean
@MockitoBean和@MockitoSpyBean可以在测试类中用于覆盖测试的ApplicationContext替换为
Mockito mock 或 spy。在后一种情况下,
原始 Bean 被间谍捕获并包装。
可以通过以下方式应用批注。
-
在 test 类或其任何超类中的非静态字段上。
-
在封闭类中的非静态字段上
@Nestedtest 类或任何类 在类型层次结构中,或者将类层次结构包含在@Nestedtest 类。 -
在测试类的类型级别,或者 type hierarchy 的 test 类。
-
在 incovering 的封闭类的类型级别上
@Nestedtest 类或任何类或 接口,或者将类层次结构包含在@Nested测试 类。
什么时候@MockitoBean或@MockitoSpyBean在字段上声明的,则 bean to mock 或 spy
是从带注释的字段的类型推断的。如果ApplicationContext一个@Qualifierannotation 可以在 field 上声明以帮助
消除歧义。在没有@Qualifierannotation 中,已注释的
field 将用作 fallback 限定符。或者,您可以显式指定
bean 名称设置为 mock 或 spy,方法是将value或name属性。
什么时候@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).
为了支持重用 mock 配置,@MockitoBean和@MockitoSpyBean可能使用
作为元注释来创建自定义组合注释 —— 例如,定义
单个注解中的常见 mock 或 spy 配置,可在测试中重复使用
套房。@MockitoBean和@MockitoSpyBean也可以用作
类型级别 — 例如,按名称模拟或侦测多个 bean。
|
限定符(包括字段的名称)用于确定单独的 |
|
用 查看上下文 层次结构与 Bean 覆盖,以获取更多详细信息和示例。 |
每个 Comments 还定义了特定于 Mockito 的属性,以微调模拟行为。
这@MockitoBeanannotation 使用REPLACE_OR_CREATE
策略。
如果相应的 bean 不存在,则将创建一个新的 bean。但是,您可以
切换到REPLACE策略,方法是将enforceOverride属性设置为true–
例如@MockitoBean(enforceOverride = true).
这@MockitoSpyBeanannotation 使用WRAP
策略,
原始实例包装在 Mockito 间谍中。此策略要求
只存在一个候选 bean。
|
只能覆盖单例 bean。任何覆盖非单例 bean 的尝试 将导致异常。 使用 使用 |
|
对 因此,此类字段可以是 |
@MockitoBean例子
以下示例演示如何使用@MockitoBean注解。
-
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoBean (1)
CustomService customService;
// tests...
}
| 1 | 将 bean 替换为类型CustomService带有 Mockito 模拟。 |
在上面的示例中,我们正在为CustomService.如果有多个 bean
的 Bean 中,名为customService被考虑。否则,测试
将失败,并且您需要提供某种限定符来识别哪个CustomServicebean 的 bean 中。如果不存在这样的 bean,则 bean 将为
使用自动生成的 Bean 名称创建。
以下示例使用 by-name 查找,而不是 by-type 查找。如果没有 bean
叫service存在,则创建一个。
-
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoBean("service") (1)
CustomService customService;
// tests...
}
| 1 | 将名为service带有 Mockito 模拟。 |
以下内容@SharedMocksannotation 注册两个 mock by-type 和一个 mock by-name。
-
Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MockitoBean(types = {OrderService.class, UserService.class}) (1)
@MockitoBean(name = "ps1", types = PrintingService.class) (2)
public @interface SharedMocks {
}
| 1 | 注册OrderService和UserService按类型模拟。 |
| 2 | 注册PrintingServicemock by-name 的 Mock 名称。 |
下面演示了如何作@SharedMocks可用于测试类。
-
Java
@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注解。
-
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoSpyBean (1)
CustomService customService;
// tests...
}
| 1 | 用 type 包装 beanCustomService与 Mockito 间谍。 |
在上面的示例中,我们使用 typeCustomService.如果超过
存在一个该类型的 bean,则名为customService被考虑。否则
测试将失败,您需要提供某种限定符来识别
哪个CustomServicebean 的 bean 进行监视。
以下示例使用 by-name 查找,而不是 by-type 查找。
-
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoSpyBean("service") (1)
CustomService customService;
// tests...
}
| 1 | 包装名为service与 Mockito 间谍。 |
以下内容@SharedSpiesannotation 按类型注册两个 Spy 和一个按名称注册 Spy。
-
Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MockitoSpyBean(types = {OrderService.class, UserService.class}) (1)
@MockitoSpyBean(name = "ps1", types = PrintingService.class) (2)
public @interface SharedSpies {
}
| 1 | 注册OrderService和UserService按类型划分的间谍。 |
| 2 | 注册PrintingService间谍别名。 |
下面演示了如何作@SharedSpies可用于测试类。
-
Java
@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 的存根配置它们
蜜蜂属。 |