簡體   English   中英

Java8 UnitTesting CompletableFuture異常

[英]Java8 UnitTesting CompletableFuture Exception

我正在使用CompletableFuture Java8類在Java中異步進行網絡調用,特別是使用supplyAsync()方法。 效果很好。 我發現我可以使用CompletableFuture.completedFuture()對“快樂之路”場景進行單元測試。 我要弄清楚的是如何對異步任務期間引發異常(例如CompletionExceptionInterruptedExceptionExecutionException )的情況進行單元測試(如果可能)。

https://www.baeldung.com/java-completablefuture是一個起點和有用的資源,但並未解決此問題。

我的第一種方法無法編譯:

final CompletableFuture<ResponseType> completableFutureException = CompletableFuture.completedFuture(new InterruptedException());

我的第二種方法可以在運行時生成ClassCastExceptionfinal CompletableFuture completableFutureException = CompletableFuture.completedFuture(new InterruptedException());

java.lang.ClassCastException: java.lang.InterruptedException cannot be cast to ResponseType

聽起來CompletableFuture<U> newIncompleteFuture()CompletableFuture<U> newIncompleteFuture()方法可能會有所幫助-a,我們暫時還停留在Java8上。 如果Java9在這里對我有幫助,我仍然很高興知道。

就像我說過的,我想弄清楚是否有一種合理的方法可以在Java8中對此進行測試(最好不使用PowerMock,因為我們很難使它與Gradle完美兼容)。 如果這真的不是可測試的,我可以接受並繼續。

Java 9引入了一種新方法failFuture來滿足這一需求。 如果您運行的是Java 8,則可以輕松創建自己的等效方法。

public static <T> CompletableFuture<T> failedFuture(Throwable ex) {
    // copied from Java 9 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletableFuture.html#failedFuture(java.lang.Throwable)
    CompletableFuture<T> f = new CompletableFuture<>();
    f.completeExceptionally(ex);
    return f;
}

CompletableFuture<ResponseType> failure = failedFuture(new InterruptedException());

另外,您可以使用supplyAsync:

CompletableFuture<ResponseType> failure = CompletableFuture.supplyAsync(() -> {throw new InterruptedException();})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM