Mockito JUnit测试:处理抛异常的静态方法以继续执行后续代码
如何用Mockito处理静态方法抛出异常,让后续代码继续执行?
当然可以!针对你说的静态方法method3抛出异常导致后续method4、method5无法执行的场景,Mockito(从3.4.0版本开始原生支持静态方法Mocking)完全能帮你解决——要么让它返回指定值替代异常,要么直接让它“安静”跳过执行,不触发异常。下面给你具体讲两种实现方式:
1. 让method3返回指定值,替代异常
假设你的静态方法属于StaticService类,原本调用时会抛出异常。我们可以通过Mock配置,让它返回你想要的结果,从而让流程继续走下去:
@Test void testServiceFlowWithMockedStaticMethod() { // 用try-with-resources包裹静态Mock,确保测试结束后清理全局Mock状态 try (MockedStatic<StaticService> mockedStatic = Mockito.mockStatic(StaticService.class)) { // 配置:当调用StaticService.method3(任意参数)时,返回指定值 mockedStatic.when(() -> StaticService.method3(anyString())) // 替换成method3实际的参数匹配器,比如anyInt() .thenReturn("mockSuccessResult"); // 调用你的服务类核心方法 yourBusinessService.executeFlow(); // 验证后续方法是否正常执行 verify(yourBusinessService, times(1)).method4(); verify(yourBusinessService, times(1)).method5(); } }
这段代码里,mockStatic创建了静态类的Mock实例,when(...).thenReturn(...)覆盖了method3的原有行为——原本会抛出的异常被替换成了指定返回值,流程自然就能继续执行后续的method4和method5了。
2. 直接跳过method3执行(不抛异常)
如果method3是void类型,或者你不需要它返回任何值,只是不想让它抛出异常中断流程,可以用doNothing()来配置:
@Test void testServiceFlowWithSilentStaticMethod() { try (MockedStatic<StaticService> mockedStatic = Mockito.mockStatic(StaticService.class)) { // 配置:调用StaticService.method3时,什么都不做,不抛异常 mockedStatic.when(() -> StaticService.method3(any())) .doNothing(); // 调用服务类方法 yourBusinessService.executeFlow(); // 验证后续方法执行情况 verify(yourBusinessService).method4(); verify(yourBusinessService).method5(); } }
如果不管method3的参数是什么,都想让它静默执行,还可以简化成:
mockedStatic.stub(() -> StaticService.method3(any())).doNothing();
几个关键注意点
- 必须用try-with-resources:
MockedStatic实现了AutoCloseable,关闭时会清除静态Mock的全局状态,避免影响其他测试用例。 - 参数匹配器要对应:根据
method3的实际参数类型选择匹配器,比如anyInt()、any(YourClass.class),不要随便用any()。 - Mockito版本要求:确保你的Mockito版本≥3.4.0,低于这个版本的话需要借助PowerMock来处理静态方法,推荐升级到新版本享受原生支持。
这样配置后,你的服务流程执行到method3时就不会被异常打断,后续的method4和method5就能正常运行啦!
内容的提问来源于stack exchange,提问作者Kapparino
相关产品推荐
相关产品推荐

