繁体   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