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

使用Mockito-inline mock带参数String返回值的静态方法时报错如何解决

问题原因

你遇到的报错核心是静态方法不遵循Java类的继承多态规则,它是和定义它的类直接绑定的:你要Mock的getSomeStringAfterSomeProcess方法定义在父类SuperStaticClass中,但你当前Mock的是子类StaticClass,Mockito无法将子类调用父类静态方法的操作识别为Mock范围内的有效调用,因此触发了MissingMethodInvocationException。
另外需要先检查类名拼写是否正确:你代码中出现了SuperStaticCLass和SuperStaticClass两种拼写,不一致会导致类加载异常,也可能触发同类报错。

解决方案

你可以选择以下任意一种方案解决问题:

方案1:直接Mock定义静态方法的父类

直接对静态方法所属的SuperStaticClass进行Mock,修改测试代码如下:

try (MockedStatic<SuperStaticClass> mocked = Mockito.mockStatic(SuperStaticClass.class)) {
    mocked.when(() -> SuperStaticClass.getSomeStringAfterSomeProcess(param))
            .thenReturn("Some Value");
    // 你的业务测试逻辑必须写在这个try代码块内部,Mock才会生效
}

方案2:在子类中显式声明同名静态方法

如果你确实需要通过StaticClass调用该静态方法并完成Mock,可以在子类中显式声明一次该静态方法,让方法绑定到子类上:

public class StaticCLass extends SuperStaticClass {
    // 显式声明同名静态方法
    public static String getSomeStringAfterSomeProcess(SomeObject object) {
        return SuperStaticClass.getSomeStringAfterSomeProcess(object);
    }
}

修改后你原来的测试代码就可以正常运行。

额外注意事项

  • 静态Mock的生效范围仅限try-with-resources包裹的代码块内,测试的业务逻辑必须放在该代码块中才能生效
  • 确保项目中所有Mockito相关依赖(比如mockito-core、mockito-junit-jupiter等)的版本和mockito-inline的3.12.4版本完全一致,避免版本冲突导致的功能异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:06:04