使用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
相关产品推荐
相关产品推荐

