验证可完成期货清单的大小

时间:2019-08-26 23:02:02

标签: java testing java-8 mockito completable-future

我有一个类似于

的代码
public void myMethod(){
    List<CompletableFuture<Void>> futures = new ArrayList<>();                

    //getQuestion, getAnswer, both returns a CompletableFuture<Void>
    futures.add(getQuestion());                
    futures.add(getAnswer());

    // make sure all the futures are executed.
    CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();

}
  • 关于如何执行 myMethod()*
  • 后,我如何测试Futures数组的大小是否为 2 的任何指示

2 个答案:

答案 0 :(得分:2)

测试数组的大小没有意义。在Java中,数组永远不会更改其大小,这也适用于futures.toArray(…)返回的数组。如果数组大小错误,则表明特定集合的toArray实现已经返回了大小错误的数组。

您可以通过使用futures.toArray(new CompletableFuture[0]))使代码更健壮,让toArray实现创建一个大小合适的数组,而不是传递预大小的数组。正如this article中所述,实际上,它甚至更快,与古老的神话相反。

当然,对于固定数量的期货,根本不需要在集合和数组之间进行转换。您可以使用

public void myMethod() {
    CompletableFuture<?>[] futures = { getQuestion(), getAnswer() };

    // make sure all the futures are executed.
    CompletableFuture.allOf(futures).join();
}

CompletableFuture.allOf的合同将返回将在所有期货均完成后完成的期货,join()将无条件等待该完成。没有什么需要检查的。如果将来有任何异常完成,则join()方法将引发异常,要么是将CompletionException作为原始异常的原因,要么是CancellationException,当异常完成是由取消引起的。

答案 1 :(得分:0)

您可以将方法分为两部分:

public void myMethod(){
    List<CompletableFuture<Void>> futures = constructFutures();

    // make sure all the futures are executed.
    CompletableFuture
        .allOf(futures.toArray(new CompletableFuture[futures.size()]))
        .join();
}

List<CompletableFuture<Void>> constructFutures() {
    List<CompletableFuture<Void>> futures = new ArrayList<>();                

    //getQuestion, getAnswer, both returns a CompletableFuture<Void>
    futures.add(getQuestion());                
    futures.add(getAnswer());

    return futures;
}

并为constructFutures()添加测试。