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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:04:59