Mockito Stub静态方法后仍执行,抛出Git异常求排查
问题描述
需要Stub的静态方法:
public static List<Path> getDiffedFilePaths(String repoDirectory, String relativeDirectoryPath) { List<Path> diffedFiles = new ArrayList<>(); try { ProcessBuilder processBuilder = new ProcessBuilder("git", "diff", "--name-only", relativeDirectoryPath); processBuilder.directory(new File(repoDirectory)); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { diffedFiles.add(Paths.get(repoDirectory, line)); } process.waitFor(); } catch (Exception e) { e.printStackTrace(); } return diffedFiles; }
编写的Stub测试代码:
@Test void testProcessCompilationUnitWithParamEnum() { try { AnnotationModifier modifier = new AnnotationModifier(); AnnotationModifier modifierSpy = Mockito.spy(modifier); List<Path> mockDiffedFiles = Arrays.asList( Path.of("mocked/file/path1"), Path.of("mocked/file/path2") ); Mockito.doReturn(mockDiffedFiles).when(modifierSpy).getDiffedFilePaths(Mockito.anyString(), Mockito.anyString()); // 调用依赖getDiffedFilePaths的主方法 } }
预期该静态方法不会被调用,但实际仍执行,抛出异常:
java.io.IOException: Cannot run program "git" (in directory ""): error=2, No such file or directory
使用的Mockito版本为4.10.0,请问问题原因是什么?
问题原因
- 你混淆了实例方法与静态方法的Stub逻辑:
getDiffedFilePaths是静态方法,但Mockito.spy()只能处理实例方法的Stub,对静态方法完全无效。 - 主方法实际调用的是静态的
AnnotationModifier.getDiffedFilePaths(...),而非你创建的spy实例上的方法,所以你的Stub规则根本没生效,静态方法会真实执行,进而触发git命令不存在的异常。 - Mockito 3.4+版本中,静态方法的Stub需要使用
Mockito.mockStatic()来专门处理目标类的静态行为,不能用实例spy的方式实现。
内容的提问来源于stack exchange,提问作者EugenSunic
相关产品推荐
相关产品推荐

