如何为ExecutorServices编写测试用例?

时间:2019-08-14 08:17:39

标签: java mockito executorservice powermockito testcase

我有一个使用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的保护。预先感谢。

1 个答案:

答案 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 方法处理结果可能也不是一个好主意,因此无论如何都要考虑重构。