使用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
相关产品推荐
相关产品推荐

