我正在使用CompletableFuture Java8类在Java中异步进行网络调用,特别是使用supplyAsync()
方法。效果很好。我发现我可以使用CompletableFuture.completedFuture()
单元测试“快乐之路”场景。我要弄清楚的是如何对异步任务期间引发异常(即CompletionException
,InterruptedException
或ExecutionException
)的情况进行单元测试(如果可能)。
https://www.baeldung.com/java-completablefuture是起点和有用的资料,但没有解决这个问题。
我的第一种方法无法编译:
final CompletableFuture<ResponseType> completableFutureException =
CompletableFuture.completedFuture(new InterruptedException());
我的第二种方法可以在运行时生成ClassCastException
:
final CompletableFuture completableFutureException =
CompletableFuture.completedFuture(new InterruptedException());
java.lang.ClassCastException: java.lang.InterruptedException cannot be cast to ResponseType
听起来似乎Java9中的CompletableFuture<U> newIncompleteFuture()
方法可能会有所帮助-las,我们暂时还停留在Java8上。如果Java9在这里对我有帮助,我仍然会很高兴知道。
正如我所说,我想弄清楚是否有一种合理的方法可以在Java8中对此进行测试(最好不使用PowerMock,因为我们很难使它与Gradle很好地兼容)。如果这真的不是可测试的,我可以接受并继续。
答案 0 :(得分:0)
Java 9引入了一种新方法failedFuture来满足这一需求。如果您运行的是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();})