使用Mockito时如何取消异常mock以设置方法的正常返回值?
问题原因
你遇到的现象是因为Mockito默认的when/thenReturn写法在已存在Stub配置时不会主动覆盖之前的规则,尤其是你这里用到的静态方法Mock场景下,未清理的Mock上下文会优先触发之前定义的异常抛出规则。
解决方案
方案1:重置已有Mock配置
直接清除之前的所有Stub规则后再重新配置新的返回规则:
- 普通实例Mock场景:
// 先重置Mock对象,清空所有历史配置 Mockito.reset(mockInstance); // 重新配置返回规则 Mockito.when(mockInstance.methodName(Matchers.any(), Matchers.any())).thenReturn(output);
- 静态方法Mock场景(你当前使用的类名直接调用方法的场景属于这类):
// 先重置静态类的Mock配置 Mockito.reset(ClassName.class); // 重新配置静态方法返回规则 MockedStatic<ClassName> mockedStatic = Mockito.mockStatic(ClassName.class); mockedStatic.when(() -> ClassName.methodName(Matchers.any(), Matchers.any())).thenReturn(output);
注意:静态方法Mock需要使用Mockito 3.4及以上版本,且引入mockito-inline依赖才能支持
方案2:按调用顺序定义多返回值
如果你需要该方法第一次调用抛异常,后续调用返回正常值,可以直接一次性配置顺序规则,不需要单独清理旧配置:
// 静态方法写法 Mockito.when(() -> ClassName.methodName(Matchers.any(), Matchers.any())) .thenThrow(new ExceptionName()) .thenReturn(output); // 普通实例方法写法 Mockito.when(mockInstance.methodName(Matchers.any(), Matchers.any())) .thenThrow(new ExceptionName()) .thenReturn(output);
按链式配置的顺序,第一次调用方法会抛出异常,第二次及之后的调用都会返回正常的output对象。
方案3:使用doReturn强制覆盖已有规则
Mockito的doReturn系列Stub方法优先级高于之前定义的when/thenThrow规则,不需要提前重置就能直接覆盖旧配置:
// 普通实例方法写法 Mockito.doReturn(output) .when(mockInstance) .methodName(Matchers.any(), Matchers.any()); // 静态方法写法 Mockito.doReturn(output) .when(ClassName.class) .methodName(Matchers.any(), Matchers.any());
内容的提问来源于stack exchange,提问作者Gaurav Jha
相关产品推荐
相关产品推荐

