1. 引言
本文将深入探讨 Mockito 中的延迟验证机制。与传统的快速失败模式不同,Mockito 允许我们收集所有验证结果,在测试结束时统一报告。这种机制在复杂测试场景中特别实用。
2. Maven 依赖
首先添加 Mockito 依赖:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.21.0</version>
</dependency>
3. 延迟验证机制
Mockito 默认采用快速失败策略——遇到第一个验证失败就立即终止测试。这种模式在简单场景下效率很高,但有时我们需要:
✅ 执行所有验证步骤
✅ 收集所有失败信息
✅ 在测试结束时统一报告
3.1 VerificationCollector 规则
VerificationCollector
是 JUnit 规则,专门用于收集测试方法中的所有验证操作。使用方式如下:
public class LazyVerificationTest {
@Rule
public VerificationCollector verificationCollector = MockitoJUnit.collector();
// 测试方法...
}
3.2 实际效果对比
看这个典型测试用例:
@Test
public void testLazyVerification() throws Exception {
List mockList = mock(ArrayList.class);
verify(mockList).add("one");
verify(mockList).clear();
}
使用延迟验证时
两个验证失败都会被报告:
org.mockito.exceptions.base.MockitoAssertionError: There were multiple verification failures:
1. Wanted but not invoked:
arrayList.add("one");
-> at com.baeldung.mockito.java8.LazyVerificationTest.testLazyVerification(LazyVerificationTest.java:21)
Actually, there were zero interactions with this mock.
2. Wanted but not invoked:
arrayList.clear();
-> at com.baeldung.mockito.java8.LazyVerificationTest.testLazyVerification(LazyVerificationTest.java:22)
Actually, there were zero interactions with this mock.
传统快速失败模式
只报告第一个失败:
Wanted but not invoked:
arrayList.add("one");
-> at com.baeldung.mockito.java8.LazyVerificationTest.testLazyVerification(LazyVerificationTest.java:19)
Actually, there were zero interactions with this mock.
⚠️ 踩坑提示:传统模式下,第二个验证失败会被完全忽略,可能导致问题被遗漏。
4. 总结
延迟验证在以下场景特别有用:
- 需要完整验证流程的集成测试
- 多个 Mock 对象的协同验证
- 调试复杂的测试失败场景
但要注意:简单测试场景下,快速失败模式通常更高效。根据实际需求选择合适的验证策略才是王道。
完整示例代码可在 GitHub 获取。