You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AssertJ比较两个CompletableFuture结果的惯用方法

更惯用的CompletableFuture结果比较方式

假设有如下定义的两个CompletableFuture<Boolean>实例:

CompletableFuture<Boolean> cf1 = CompletableFuture.completedFuture(true);
CompletableFuture<Boolean> cf2 = CompletableFuture.completedFuture(true);

常规做法是调用get()获取结果后再比较,但确实有更符合Java异步编程惯用风格的写法,下面是几种常见方案:

方案1:利用thenCombine组合结果并断言

通过thenCombine方法等待两个Future都完成,直接对结果做相等性比较,生成一个新的Future,再断言这个Future的结果:

CompletableFuture<Boolean> resultFuture = cf1.thenCombine(cf2, Object::equals);
assertThat(resultFuture)
    .succeedsWithin(Duration.ofSeconds(1))
    .isTrue();

这种方式完全基于CompletableFuture的异步组合API,无需手动阻塞获取结果,且适用于任意类型(只要目标类型正确实现了equals方法)。

方案2:先确保所有Future完成,再比较结果

如果需要明确等待两个Future都完成后再做断言,可以用allOf方法,结合join()(无需处理检查异常)实现:

// 等待两个Future都完成
CompletableFuture.allOf(cf1, cf2).join();
// 比较结果
assertThat(cf1.join()).isEqualTo(cf2.join());

这种写法逻辑直观,适合需要对两个Future的结果做更复杂验证的场景。

方案3:单Future断言链中关联另一个Future的结果

如果已经在使用AssertJ的Future断言链,可以直接在断言中获取另一个Future的结果(用join()避免检查异常):

assertThat(cf1)
    .succeedsWithin(Duration.ofSeconds(1))
    .isEqualTo(cf2.join());

这种写法简洁,但要注意cf2.join()会先阻塞等待其完成,再和cf1的结果做比较。

内容的提问来源于stack exchange,提问作者Bhushan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:30:58