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里面的代碼了。