Mockito中出现Unfinished Stubbing Detected错误,求排查解决
Mockito存根未完成问题解决方案
错误信息
检测到未完成的存根操作:
错误发生在doCallRealMethod()代码行
原测试代码
class Mocktest { KafkaProducer kafkaProducer = Mockito.mock(KafkaProducer.class); @Test public void consumeRecordsTest() throws IOException { doCallRealMethod().when(this.kafkaProducer).publishMessage(any(BaseBizDTO.class)); ArgumentCaptor<BaseBizDTO> argument = ArgumentCaptor.forClass(BaseBizDTO.class); verify(this.kafkaProducer, atMost(2)).publishMessage(argument.capture()); List<BaseBizDTO> values = argument.getAllValues(); } } class KafkaProducer { public void publishMessage(BaseBizDTO dto) {} }
问题原因
- 测试流程缺失关键步骤:存根后未触发
publishMessage方法的调用,直接执行验证操作,导致Mockito存根逻辑异常。 - 可能存在Mockito静态方法未正确导入的情况,导致语法解析错误触发存根未完成提示。
修复方案
1. 补充必要的静态导入
确保导入Mockito核心静态方法:
import static org.mockito.Mockito.*; import static org.mockito.ArgumentMatchers.*; import static org.junit.jupiter.api.Assertions.*; // 若使用JUnit 5,用于断言
2. 修改测试代码,完善测试流程
class Mocktest { KafkaProducer kafkaProducer = Mockito.mock(KafkaProducer.class); @Test public void consumeRecordsTest() throws IOException { // 存根:指定mock对象调用publishMessage时执行真实方法 doCallRealMethod().when(kafkaProducer).publishMessage(any(BaseBizDTO.class)); // 触发目标方法调用(原代码缺失此步骤) kafkaProducer.publishMessage(new BaseBizDTO()); kafkaProducer.publishMessage(new BaseBizDTO()); // 创建参数捕获器 ArgumentCaptor<BaseBizDTO> argument = ArgumentCaptor.forClass(BaseBizDTO.class); // 验证方法调用次数并捕获参数 verify(kafkaProducer, atMost(2)).publishMessage(argument.capture()); // 获取并验证捕获的参数 List<BaseBizDTO> values = argument.getAllValues(); assertEquals(2, values.size()); // 可选:添加断言验证结果 } } class KafkaProducer { public void publishMessage(BaseBizDTO dto) {} } // 补充原代码缺失的BaseBizDTO类定义 class BaseBizDTO {}
说明
- 必须在存根完成后触发目标方法的调用,否则Mockito无法捕获方法调用记录,验证操作会失败,甚至触发存根未完成的异常。
- 确保所有Mockito相关的静态方法都被正确导入,避免因方法引用错误导致的语法问题。
内容的提问来源于stack exchange,提问作者mohitsahu
相关产品推荐
相关产品推荐

