You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:24:06