如何在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()但未做任何有效断言验证,需要补充对异步任务结果的断言,同时确保等待任务完成:
- 等待异步任务完成并获取结果:使用
CompletableFuture.join()(无需处理检查型异常,更适配测试场景)或get()(需捕获InterruptedException和ExecutionException)。 - 添加结果断言:根据Mock仓库的预设行为,用JUnit的
Assertions类验证返回值是否符合预期。 - 可选:断言任务状态:验证任务确实已完成,增强测试严谨性。
修改后的测试代码示例:
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
相关产品推荐
相关产品推荐

