当使用 ExecutorService 运行 时,Mockito Verify "times" 显示的计数少于实际计数
Mockito Verify "times" shows lesser count then actual when run with ExecutorService
我正在尝试对包含执行程序服务的代码 运行 进行单元测试,其中 api 被调用两次或更多次,具体取决于列表中的设备数量。当我尝试从控制台对其进行单元测试时,Mockito 验证失败并抛出一个错误,即在我通过设备列表时 Api 仅被调用一次。但是,当我在 intellij 中调试时,它可以正常工作并根据列表中的设备编号执行和验证。
代码如下
final ExecutorService executor = new ThreadPoolExecutor(MAX_THREADS,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
DeviceList.stream().forEach(device -> executor.execute(() ->
GatewayToTest.deliver(device, id, testObject)));
单元测试代码:
verify(GatewayToTest, times(devices.size()))
.deliver(any(Device.class), anyString(), any(TestObject.class));
在上面的代码中,当我 运行 在控制台中进行单元测试时,GatewayToTest 只被调用一次。
异步执行 运行,因此您不能保证对 GatewayToTest.deliver
的所有调用都发生在 verify
之前。
提交任务执行后尝试等待终止:
executor.awaitTermination(10,TimeUnit.SECONDS);
我正在尝试对包含执行程序服务的代码 运行 进行单元测试,其中 api 被调用两次或更多次,具体取决于列表中的设备数量。当我尝试从控制台对其进行单元测试时,Mockito 验证失败并抛出一个错误,即在我通过设备列表时 Api 仅被调用一次。但是,当我在 intellij 中调试时,它可以正常工作并根据列表中的设备编号执行和验证。
代码如下
final ExecutorService executor = new ThreadPoolExecutor(MAX_THREADS,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
DeviceList.stream().forEach(device -> executor.execute(() ->
GatewayToTest.deliver(device, id, testObject)));
单元测试代码:
verify(GatewayToTest, times(devices.size()))
.deliver(any(Device.class), anyString(), any(TestObject.class));
在上面的代码中,当我 运行 在控制台中进行单元测试时,GatewayToTest 只被调用一次。
异步执行 运行,因此您不能保证对 GatewayToTest.deliver
的所有调用都发生在 verify
之前。
提交任务执行后尝试等待终止:
executor.awaitTermination(10,TimeUnit.SECONDS);