Junit 测试或模拟调用 ThreadPoolExecutor 的提交方法,传递 lambda 表达式

问题描述

我有一个声明如下所示,我需要测试/验证调用

snmpdispatchDelegateExecutor.submit(() -> processRunFunctionException(exception));

现在它同时包含很多东西(异步调用、lambda 和私有方法合二为一),所以我有一些问题: 1:用于处理返回未来任务的 submit() 调用。 我必须做类似的事情吗

when(snmpdispatchDelegateExecutorMock.submit(any()/Runnable)).thenReturn(any()/FutureTask). 

那么问题是如何实现(创建Runnable和Future)。尝试创建两个看起来都很复杂。

2: processRunFunctionException(exception) 是一个私有方法,我们需要覆盖它吗,很多“SO”帖子都说不需要覆盖私有方法。一般来说,如果我专注于覆盖公共方法,私有方法也应该被覆盖。引用this

3:如何在此处使用 lambda 表达式。经历了 link 但没有太大帮助。

解决方法

模拟您不拥有的类通常是有问题的,因为您在测试中硬编码了可能与实际行为不匹配的行为。

我建议使用真正的 ExecutorService 实现。例如,您可以使用在当前线程中完成其工作的实现(请参阅 Is there an ExecutorService that uses the current thread?)或仅在您告诉它时才完成工作的实现。