Mockito验证抽象方法异常:待测试类方法调用未被检测到
问题根源找到了!
你遇到的verify(readBlock)验证失败,核心原因是调用loadFile(null)时,代码在父类FileParser.loadFile的打印语句里触发了空指针异常,导致方法提前返回,根本没走到调用readBlock的逻辑。
咱们一步步捋执行流程:
- 你调用
jsonFileParser.loadFile(null),传入的fileSetting是null - 你用
doReturn(true)让movFile返回true,所以跳过了第一个return分支 - 接下来执行
System.out.println("file after move "+fileSetting.getFile().getAbsolutePath());——这里fileSetting是null,调用fileSetting.getFile()直接抛出NullPointerException - 异常被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
相关产品推荐
相关产品推荐

