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

Mockito模拟Future的get()方法无法抛出异常,无法覆盖catch块?

解决Future.get()异常捕获的测试覆盖问题

核心问题分析

你的测试代码存在关键错误:thenThrow方法需要直接传入Throwable类型的异常实例,但你传的是CompletableFuture.completedFuture(interruptedException)——这是一个Future对象而非异常本身,Mockito无法识别该参数,导致mock逻辑不生效,自然不会触发目标catch块。

正确的测试写法

测试InterruptedException场景

@Test
public void testInterruptedException() throws ExecutionException, InterruptedException {
    // 1. 创建Mock的Future对象
    Future<Class> mockFuture = Mockito.mock(Future.class);
    
    // 2. 配置Mock规则:调用get()时抛出InterruptedException
    InterruptedException ex = new InterruptedException("Interrupted Exception");
    Mockito.when(mockFuture.get()).thenThrow(ex);
    
    // 3. 构造业务方法依赖的futureData列表,注入Mock对象
    List<Future<Class>> futureData = Collections.singletonList(mockFuture);
    
    // 4. 调用目标业务方法(替换为你的实际业务方法名)
    yourService.processFutureData(futureData);
    
    // 5. 验证catch块逻辑是否执行(比如验证日志输出、状态变更等)
    // 示例:verify(logger).error(anyString(), eq(ex));
}

测试ExecutionException场景

@Test
public void testExecutionException() throws ExecutionException, InterruptedException {
    Future<Class> mockFuture = Mockito.mock(Future.class);
    
    // ExecutionException通常包装一个具体的异常原因
    Throwable taskFailureCause = new RuntimeException("Task execution failed");
    ExecutionException ex = new ExecutionException(taskFailureCause);
    Mockito.when(mockFuture.get()).thenThrow(ex);
    
    List<Future<Class>> futureData = Collections.singletonList(mockFuture);
    yourService.processFutureData(futureData);
    
    // 验证catch块逻辑
}

额外注意事项

  • 确保业务代码中遍历的futureData是测试用例注入的Mock列表,而非方法内部自行创建的真实Future对象。如果业务方法内部生成futureData,需要通过依赖注入或参数传递的方式替换为Mock列表,否则Mock规则不会生效。
  • 若使用doThrow语法,逻辑与thenThrow一致,仅写法不同:
    Mockito.doThrow(ex).when(mockFuture).get();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:35:38