使用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
相关产品推荐
相关产品推荐

