CompletableFuture是一个很好用的工具,可最近在做单测mock时发现一直阻塞,刚开始以为是代码死循环问题,但经过一番排查,发现并不是,直接上代码:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// do something
return "";
}, executor);
CompletableFuture.allOf(future).join();
future.get();
当执行单测时,发现运行到CompletableFuture.allOf(future).join();这行时会一直阻塞,不往后运行
解决办法
上述发现异步线程没有得到执行,导致一直阻塞;因此我们就需要想办法让异步线程执行,可以借助Mockito.doAnswer:
Mockito.doAnswer(invocationOnMock -> {
((Runnable) invocationOnMock.getArguments()[0]).run();
return null;
}).when(scheduleExecutor).execute(Mockito.any(Runnable.class));
添加Mockito.doAnswer代码后,发现代码就不会阻塞了,同时,调整debug模式为thread, 就可以debug进runnable里面的代码了。
网友评论