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

使用Mockito验证同一类多静态方法调用的报错及无PowerMock解决方法

问题解决说明

能否不使用PowerMock?

可以。Mockito 3.4及以上版本的原生静态Mock机制已经支持同个类多个静态方法的Mock与验证,不需要引入PowerMock即可实现需求。

报错原因

你遇到的异常是因为Mockito对静态方法验证的lambda有强制校验:验证时传入的lambda内,只能出现你要验证的单个目标静态方法调用,如果lambda内显式/隐式调用了同一个类的其他静态方法,就会触发该报错。

正确验证多个静态方法的方式

你只需要为每个要验证的静态方法编写独立的verify语句,每个语句的lambda内仅保留对应要验证的方法调用即可。

修正后代码示例

try (MockedStatic<MyClass1> theMock = Mockito.mockStatic(MyClass1.class);
    MockedStatic<MyClass2> configMock = Mockito.mockStatic(MyClass2.class);
    MockedStatic<MyClass3> downtimeMock = Mockito.mockStatic(MyClass3.class)) {
        theMock.when(MyClass1::lockAndFetch).thenReturn(duRuns);
        theMock.when(() -> MyClass1.startAndUnlock(1)).thenAnswer(invocation -> null);
        configMock.when(() -> MyClass2.getById(1)).thenReturn(dummyConfig);
        downtimeMock.when(() -> MyClass3.isScheduledForRole("app-dummy")).thenReturn(false);
        
        new RunExecutor().run(); 

        // 分别验证两个静态方法,每个verify只对应一个方法调用
        theMock.verify(MyClass1::lockAndFetch);
        theMock.verify(() -> MyClass1.startAndUnlock(1));
}

注意事项

  • 如果要验证调用次数,可在verify的第二个参数传入次数规则,例如theMock.verify(() -> MyClass1.startAndUnlock(1), times(1))
  • 不要在验证用的lambda内添加任何额外逻辑、同类其他方法调用、分支或循环语句
  • 如果你使用的Mockito版本低于4.8,建议升级到4.8及以上版本,该版本修复了多个同类静态方法Mock后验证的已知bug

内容的提问来源于stack exchange,提问作者Gyanendra Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:30:03