gpt4 book ai didi

java - Mockito 超时验证在并发执行时意外失败

转载 作者:行者123 更新时间:2023-12-01 10:40:46 27 4
gpt4 key购买 nike

我刚刚编写了一个 Mockito 代码来测试并发调用模拟对象上的方法时的 verify(mock, ti​​meout()) 功能。

@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秒。有什么想法吗?

最佳答案

在mockito 1.9.0中这是一个错误,但已经被修复,因此从版本1.9.5及更高版本(包括1.10.x、2.x)可以正常工作。

关于java - Mockito 超时验证在并发执行时意外失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34416997/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com