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 获取。


原始标题:Lazy Verification with Mockito 2