Mockito验证超时错误会导致并发执行无法预测

时间:2015-12-22 13:28:56

标签: java junit concurrency mocking executorservice

我只是在同时调用模拟对象上的方法时编写了一个Mockito代码来测试verify(mock, timeout())功能。

@RunWith(Parameterized.class)
public class MockitoTest {
    @Parameters
    public static Collection<Object[]> data() {
        return Stream.generate(() -> new Object[]{}).limit(100).collect(Collectors.toList());
    }

    @Test
    public void testVerifyTimeout() throws Exception {
        List listMock = mock(List.class);
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        Stream.iterate(0, i -> i + 1).limit(10).map(i -> new AddToListTask(listMock, i)).forEach(executorService::submit);
        verify(listMock, timeout(1000)).add(2);
        executorService.shutdown();
    }

    private static class AddToListTask implements Callable<Void> {
        private final List<Integer> list;
        private final int value;

        public AddToListTask(List<Integer> list, int value) {
            this.list = list;
            this.value = value;
        }

        @Override
        public Void call() throws Exception {
            list.add(value);
            return null;
        }
    }
}

此测试在100次运行中随机失败10-20次。这是一个非常基本的情况,我们同时运行模拟方法,并且结果并不总是正确验证。 每次测试运行大约25ms-50ms,但即使失败,也不会等待1秒。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在mockito 1.9.0中,这是一个错误,但已经修复,因此从版本1.9.5开始(包括1.10.x,2.x)运行良好。