如何使用Mockito验证列表中仅一个实例的invokeMe方法被调用
Mockito验证列表中仅有一个实例方法被调用的实现方案
可以实现,具体操作方案如下:
前置准备
你需要先将列表内的所有MyClass实例替换为Mockito的Spy(如果需要保留原有方法逻辑)或Mock(如果仅需要监控调用不需要执行真实逻辑),这样才能捕获方法的调用记录:
// 示例:将原列表实例转为Spy对象 List<MyClass> list = originalInstanceList.stream() .map(Mockito::spy) .toList();
多线程场景注意事项
在执行验证前必须确保所有访问该列表的工作线程已全部执行完成,避免因线程未执行完导致验证结果错误,推荐使用CountDownLatch、CyclicBarrier等JDK自带的同步工具实现线程等待。
核心验证逻辑
通过遍历列表内的所有实例,统计调用过invokeMe()方法的实例数量,最终断言仅有1个实例被调用即可:
long invokedInstanceCount = list.stream() .filter(instance -> { try { // 验证当前实例的invokeMe方法至少被调用过1次 Mockito.verify(instance, Mockito.atLeastOnce()).invokeMe(); return true; } catch (AssertionError e) { // 未被调用的实例触发verify断言失败,返回false return false; } }) .count(); // 断言仅有1个实例的invokeMe方法被调用 org.junit.Assert.assertEquals(1, invokedInstanceCount);
额外说明
- 如果你需要严格限制被调用的实例仅被调用1次,将
Mockito.atLeastOnce()替换为Mockito.times(1)即可。 - 如果
MyClass是final类,需要启用Mockito的inline mock maker才能正常生成Spy/Mock对象。
内容的提问来源于stack exchange,提问作者user8473984
相关产品推荐
相关产品推荐

