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

