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

使用Mockito测试ExecutorService的正确方式咨询

问题分析与解决办法

你的测试写法不正确,报错原因是:你在when里写的() -> any()是创建了一个全新的Lambda实例,和被测代码中传给submit的Lambda不是同一个对象,Mockito无法匹配这两个不同的参数实例,因此抛出参数不匹配的错误。

简单解决办法

修改测试代码的Stubbing部分,用any(Runnable.class)匹配任意Runnable类型的参数,同时在doAnswer中获取并执行被测代码里的Lambda逻辑:

@Mock
ExecutorService executorServiceMock;

// 测试方法内
doAnswer(invocation -> {
    // 获取传入submit的Runnable
    Runnable task = invocation.getArgument(0);
    // 执行Lambda里的逻辑(也就是原代码中的someCool.stuffInHere)
    task.run();
    return null; // submit返回Future,测试时返回null即可
}).when(executorServiceMock).submit(any(Runnable.class));

为什么这样可行?

  • any(Runnable.class)告诉Mockito:匹配任何传入submit方法的Runnable类型参数,不用纠结具体是哪个Lambda实例。
  • 通过invocation.getArgument(0)拿到被测代码中实际传入的Lambda任务,调用run()就能触发原方法里的业务逻辑,不需要你手动复制someCool.stuffInHere的代码,测试更准确且维护性更高。

如果你的需求是替换原Lambda的逻辑(而非执行原逻辑),可以直接在doAnswer里写自己的测试逻辑,比如:

doAnswer(invocation -> {
    // 这里写你自己的测试逻辑,代替原有的someCool.stuffInHere
    testSomeCoolStuffInHere();
    return null;
}).when(executorServiceMock).submit(any(Runnable.class));

内容的提问来源于stack exchange,提问作者gilbo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:59:54