我有一个使用ExecutorService创建和执行多个线程的方法。代码工作正常。现在,我想为JUNIT编写相同的测试用例。 代码如下:
private void method(Long input1, object result)
{
ExecutorService executor = Executors.newFixedThreadPool(4);
List<Callable< myObject>> callables = Arrays.asList( callables as List);
try
{
List<Future< myObject>> futures = executor.invokeAll(callables);
executor.shutdown();
for(Future< myObject> f : futures)
{
method(f, result);
}
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我是JUnit测试用例的新手。我已经在互联网上寻找答案,但是没有针对我问题的具体答案。
我需要编写测试用例的帮助,以使其受Jacoco的保护。预先感谢。
答案 0 :(得分:0)
借助PowerMockito
,您可以模拟静态方法:
Executors.newFixedThreadPool
。
ExecutorService executors = Mockito.mock(ExecutorService.class);
Mockito.when(executors.invokeAll()).thenReturn( <list of futures> );
PowerMockito.mockStatic(Executors.class);
PowerMockito.when(Executors.newFixedThreadPool(anyInt())).thenReturn(executors);
旨在使用包含真实list
的真实Future
(如果可能)。
(也不要忘记将正确的类放入@PrepareForTest
注释中)
这样的测试是否有意义取决于method(f, result);
在做什么。如果我们假设其为private
方法,则可能没有其他测试/发现方法。
将任务提交到ExecutorService
并以 blocking 方法处理结果可能也不是一个好主意,因此无论如何都要考虑重构。