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

