【问题标题】:Verify size of list of completablefutures验证可完成期货列表的大小
【发布时间】:2019-08-26 23:02:02
【问题描述】:

我有一个类似于

的代码
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()* 之后,我如何测试期货数组的大小是否为 2 的任何指针

【问题讨论】:

  • 您可以将返回类型设为 int 并仅返回期货集合的大小?
  • 很遗憾,我不能,myMethod() 是接口的一部分,它是无效的。
  • 您可能需要在方法内部的其他地方设置一个变量,然后在方法完成后检查该变量,这取决于如何调用它,因为您需要确保该变量不会同时从多个地方更新。
  • @Plancke,您是否建议将期货列表保留为类变量?如果是,我尝试这样做,但我仍然不确定,我该如何测试。另外,我觉得这可能也不是正确的方法..
  • CompletableFuture#allOf#join 确保所有这些都运行并完成。如果任何一个期货失败,那么 allOf 也将失败。因此,您可能希望对各个期货进行错误处理,因为如果两者都失败,主期货可能会错过堆栈跟踪。为什么你需要知道运行了多少个期货?

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


【解决方案1】:

测试数组的大小是没有意义的。在 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 异常完成是由取消引起的。

【讨论】:

    【解决方案2】:

    你可以把方法一分为二:

    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() 添加测试。

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2022-11-04
      • 2023-03-03
      • 2013-06-29
      • 1970-01-01
      相关资源
      最近更新 更多