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

Mockito验证抽象方法异常:待测试类方法调用未被检测到

问题根源找到了!

你遇到的verify(readBlock)验证失败,核心原因是调用loadFile(null)时,代码在父类FileParser.loadFile的打印语句里触发了空指针异常,导致方法提前返回,根本没走到调用readBlock的逻辑。

咱们一步步捋执行流程:

  1. 你调用jsonFileParser.loadFile(null),传入的fileSetting是null
  2. 你用doReturn(true)让movFile返回true,所以跳过了第一个return分支
  3. 接下来执行System.out.println("file after move "+fileSetting.getFile().getAbsolutePath());——这里fileSetting是null,调用fileSetting.getFile()直接抛出NullPointerException
  4. 异常被catch块捕获,打印完错误信息就return null了,readBlock(fileSetting)这一行完全没机会执行

这就是为什么Mockito说readBlock没被调用的原因!

修复方案

要让readBlock被调用,你得确保loadFile能顺利走完正常流程,避开空指针。可以这么调整测试代码:

@Test
public void validatorNotTrue() throws JsonProcessingException, IOException{
    // 1. Mock一个有效的FileSettingsToSend对象,避免空指针
    FileSettingsToSend mockFileSetting = Mockito.mock(FileSettingsToSend.class);
    File mockFile = Mockito.mock(File.class);
    // 让getFile返回mock的File实例
    when(mockFileSetting.getFile()).thenReturn(mockFile);
    // 如果后续方法需要用到目录路径,也得mock一下
    when(mockFileSetting.getDiretoryPath()).thenReturn("/test/dir");

    // 2. 保留原有的mock配置
    when(jsonFileValidatorService.checkFileFormat(any(FileSettingsToSend.class))).thenReturn(true);
    JsonFileParser jsonFileParser = Mockito.spy(jsonFileParserMock);
    doReturn(true).when(jsonFileParser).movFile(anyString(), any(FileSettingsToSend.class));

    // 3. 调用loadFile时传入mock的对象,别传null了
    jsonFileParser.loadFile(mockFileSetting);

    // 4. 现在verify应该能成功通过
    verify(jsonFileParser, times(1)).movFile(anyString(), any(FileSettingsToSend.class));
    verify(jsonFileValidatorService, times(1)).checkFileFormat(any(FileSettingsToSend.class));
    verify(jsonFileParser, times(1)).readBlock(any(FileSettingsToSend.class));
}

另外,你的测试里还有两个小细节可以优化:

  • assertTrue(jsonFileParser.movFile(anyString(), anyObject()));这行是直接调用了movFile方法,不是验证mock行为,应该用verify来确认它被调用的次数,而不是直接执行
  • assertTrue(jsonFileValidatorService.checkFileFormat( anyObject() ));同理,这也是直接调用方法,正确做法是用verify来验证它是否被调用过
额外提醒

测试null参数场景时,一定要仔细梳理代码执行路径,尤其是可能抛出异常的地方。你父类的loadFile方法没有对fileSetting做null校验,导致传入null直接抛异常——如果业务允许传null,建议在方法开头加null判断;如果不允许,应该明确抛出IllegalArgumentException,这样代码更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:27:53