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

如何在JUnit Mockito中为CompletableFuture<Boolean>添加断言

如何为异步Service测试添加断言解决SonarQube提示?

我有一个名为AsynEvaluaEstadoSiniestro的Service,它返回true或false,测试中已Mock相关仓库。

Service代码

@Service
@Slf4j
public class AsynEvaluaEstadoSiniestroImpl implements AsynEvaluaEstadoSiniestro {

  @Async("myExecutor")
  public CompletableFuture<Boolean> getEvaluacionEstadoSiniestro(DocumentRequest request) throws BusinessException {
    // 执行仓库持久化操作,返回true或false的fooResult
    return CompletableFuture.completedFuture(fooResult);
  }
}

原测试代码

@InjectMocks
AsynEvaluaEstadoSiniestroImpl asynEvaluaEstadoSiniestro;

@Test
@DisplayName("Async process (1)")
void insertarSolicitudTest() throws BusinessException {
   // 测试所需的仓库Mock配置

   CompletableFuture<Boolean> cf = asynEvaluaEstadoSiniestro.getEvaluacionEstadoSiniestro(documentRequest());
   cf.isDone();
}

执行SonarQube Coverity时提示:为该测试用例添加至少一个断言。请问如何为这个测试添加断言?


解决方案

原测试仅调用了cf.isDone()但未做任何有效断言验证,需要补充对异步任务结果的断言,同时确保等待任务完成:

  1. 等待异步任务完成并获取结果:使用CompletableFuture.join()(无需处理检查型异常,更适配测试场景)或get()(需捕获InterruptedException和ExecutionException)。
  2. 添加结果断言:根据Mock仓库的预设行为,用JUnit的Assertions类验证返回值是否符合预期。
  3. 可选:断言任务状态:验证任务确实已完成,增强测试严谨性。

修改后的测试代码示例:

import static org.junit.jupiter.api.Assertions.*;

@InjectMocks
AsynEvaluaEstadoSiniestroImpl asynEvaluaEstadoSiniestro;

@Test
@DisplayName("Async process (1)")
void insertarSolicitudTest() throws BusinessException {
   // 测试所需的仓库Mock配置,例如预设仓库操作返回true
   // when(仓库方法).thenReturn(对应结果);

   CompletableFuture<Boolean> cf = asynEvaluaEstadoSiniestro.getEvaluacionEstadoSiniestro(documentRequest());
   // 等待任务完成并获取结果
   Boolean result = cf.join();
   // 断言结果符合预期
   assertTrue(result);
   // 可选:断言任务已完成
   assertTrue(cf.isDone());
}

如果需要测试返回false的场景,只需调整Mock仓库的预设行为,将断言改为assertFalse(result)即可。

内容的提问来源于stack exchange,提问作者Jesus Gino Huapaya Caycho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:22:30