CompletableFuture使用Mockito阻塞問題解決

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容