此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.6! |
@MockitoBean
和@MockitoSpyBean
@MockitoBean
和@MockitoSpyBean
可以在测试类中用于覆盖测试的ApplicationContext
替换为
Mockito mock 或 spy。在后一种情况下,
原始 Bean 被间谍捕获并包装。
可以通过以下方式应用批注。
-
在 test 类或其任何超类中的非静态字段上。
-
在封闭类中的非静态字段上
@Nested
test 类或任何类 在类型层次结构中,或者将类层次结构包含在@Nested
test 类。 -
在测试类的类型级别,或者 type hierarchy 的 test 类。
-
在 incovering 的封闭类的类型级别上
@Nested
test 类或任何类或 接口,或者将类层次结构包含在@Nested
测试 类。
什么时候@MockitoBean
或@MockitoSpyBean
在字段上声明的,则 bean to mock 或 spy
是从带注释的字段的类型推断的。如果ApplicationContext
一个@Qualifier
annotation 可以在 field 上声明以帮助
消除歧义。在没有@Qualifier
annotation 中,已注释的
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 覆盖,以获取更多详细信息和示例。 |
每个 annotation 还定义了特定于 Mockito 的属性,以微调模拟行为。
这@MockitoBean
annotation 使用REPLACE_OR_CREATE
策略。
如果相应的 bean 不存在,则将创建一个新的 bean。但是,您可以
切换到REPLACE
策略,方法是将enforceOverride
属性设置为true
–
例如@MockitoBean(enforceOverride = true)
.
这@MockitoSpyBean
annotation 使用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
被考虑。否则,测试
将失败,并且您需要提供某种限定符来识别哪个CustomService
bean 的 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 模拟。 |
以下内容@SharedMocks
annotation 注册两个 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 | 注册PrintingService mock 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
被考虑。否则
测试将失败,您需要提供某种限定符来识别
哪个CustomService
bean 的 bean 进行监视。
以下示例使用 by-name 查找,而不是 by-type 查找。
-
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoSpyBean("service") (1)
CustomService customService;
// tests...
}
1 | 包装名为service 与 Mockito 间谍。 |
以下内容@SharedSpies
annotation 按类型注册两个 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 的存根配置它们
蜜蜂属。 |