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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 04:15:03