此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
@MockitoBean
和@MockitoSpyBean
@MockitoBean
和@MockitoSpyBean
可以在测试类中用于覆盖测试的ApplicationContext
使用
Mockito 分别是模拟或间谍。在后一种情况下,早期实例
原始豆子被间谍捕获并包裹起来。
可以通过以下方式应用注释。
-
在测试类或其任何超类中的非静态字段上。
-
在封闭类中的非静态字段上,对于
@Nested
测试类或任何类 在类型层次结构或封闭类层次结构中@Nested
test 类。 -
在测试类或任何超类或实现接口的类型级别 类型层次结构。
-
在封闭类的类型级别上,对于
@Nested
test 类或在任何类上或 接口在类型层次结构中或封闭类层次结构中@Nested
测试 类。
什么时候@MockitoBean
或@MockitoSpyBean
在字段上声明,要模拟或监视的 bean
是从带注释的字段的类型推断出来的。如果ApplicationContext
一个@Qualifier
可以在字段上声明注释以提供帮助
消歧义。在没有@Qualifier
注释,注释的名称
字段将用作回退限定符。或者,您可以显式指定
bean name 通过设置value
或name
属性。
什么时候@MockitoBean
或@MockitoSpyBean
在类型级别声明,bean 的类型
(或 bean)来模拟或间谍必须通过types
属性 –
例如@MockitoBean(types = {OrderService.class, UserService.class})
.如果多个
候选存在于ApplicationContext
,您可以显式指定一个 bean 名称
mock 或 spy 通过设置name
属性。但是请注意,该types
属性
如果显式 Beanname
已配置 - 例如@MockitoBean(name = "ps1", types = PrintingService.class)
.
为了支持重用模拟配置,@MockitoBean
和@MockitoSpyBean
可以使用
作为元注释来创建自定义组合注释 - 例如,定义
可以在整个测试中重复使用的单个注释中的通用模拟或间谍配置
套房。@MockitoBean
和@MockitoSpyBean
也可以用作可重复的注释
类型级别——例如,按名称模拟或监视多个 bean。
限定符(包括字段名称)用于确定单独的 |
用 查看上下文 层次结构与 bean 覆盖有关更多详细信息和示例。 |
每个注解还定义了特定于 Mockito 的属性,以微调模拟行为。
这@MockitoBean
注释使用REPLACE_OR_CREATE
bean 覆盖的策略。
如果不存在相应的 bean,则会创建一个新的 bean。但是,您可以
切换到REPLACE
策略,通过设置enforceOverride
属性设置为true
–
例如@MockitoBean(enforceOverride = true)
.
这@MockitoSpyBean
注释使用WRAP
战略,
原始实例被包装在 Mockito 间谍中。该策略要求
只存在一个候选 Bean。
只能覆盖单例 Bean。任何重写非单例 Bean 的尝试 将导致异常。 使用时 使用时 |
对可见性没有限制 因此,此类字段可以是 |
@MockitoBean
例子
以下示例显示如何使用@MockitoBean
注解。
-
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoBean (1)
CustomService customService;
// tests...
}
1 | 将 bean 替换为 typeCustomService 带有 Mockito 模拟。 |
在上面的示例中,我们正在为CustomService
.如果多个 bean
该类型存在,则名为customService
被考虑。否则,测试
将失败,并且您需要提供某种限定符来识别CustomService
要覆盖的 bean。如果不存在这样的 bean,则 bean 将是
使用自动生成的 bean 名称创建。
以下示例使用按名称查找,而不是按类型查找。如果没有豆子
叫service
存在,则创建一个。
-
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoBean("service") (1)
CustomService customService;
// tests...
}
1 | 替换名为service 带有 Mockito 模拟。 |
以下内容@SharedMocks
注释按类型注册两个模拟,按名称注册一个模拟。
-
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 模拟名称。 |
下面演示了如何@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 | (可选)注入模拟以存根或验证它们。 |
模拟也可以注入到@Configuration 类或其他与测试相关的课程
组件中的ApplicationContext 以便使用 Mockito 的存根配置它们
蜜蜂属。 |
@MockitoSpyBean
例子
以下示例显示如何使用@MockitoSpyBean
注解。
-
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoSpyBean (1)
CustomService customService;
// tests...
}
1 | 用类型包装 beanCustomService 与 Mockito 间谍。 |
在上面的示例中,我们用类型包装 beanCustomService
.如果超过
存在一个该类型的 bean,名为customService
被考虑。否则
测试将失败,您需要提供某种限定符来识别
哪个CustomService
你想监视的豆子。
以下示例使用按名称查找,而不是按类型查找。
-
Java
@SpringJUnitConfig(TestConfig.class)
class BeanOverrideTests {
@MockitoSpyBean("service") (1)
CustomService customService;
// tests...
}
1 | 包装名为service 与 Mockito 间谍。 |
以下内容@SharedSpies
注释按类型注册两个间谍,按名称注册一个间谍。
-
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 | (可选)注入间谍来存根或验证它们。 |
间谍也可以被注入@Configuration 类或其他与测试相关的课程
组件中的ApplicationContext 以便使用 Mockito 的存根配置它们
蜜蜂属。 |