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

Mockito如何仅mock方法第一次调用,其余调用保留原有逻辑不做处理

实现方案

首先你需要确保myType是Mockito的Spy对象而非普通Mock对象,只有Spy对象才支持调用目标类的真实逻辑,创建Spy的代码如下:

MyType myType = Mockito.spy(new MyType());

你之前尝试用doNothing()不生效,是因为doNothing()仅适用于无返回值的void方法,有返回值的方法要走真实逻辑需要用thenCallRealMethod()相关API,有两种常用写法可以实现「仅第一次调用走Mock逻辑,后续调用走真实逻辑」的需求:

  1. 链式调用thenCallRealMethod()
// 写法1:适合无副作用的方法,定义规则时不会提前触发真实方法执行的场景
when(myType.func()).thenReturn("firstMockValue").thenCallRealMethod();
  1. 改用doReturn系列方法(更推荐用于Spy对象)
    如果你的func()方法有副作用,用when定义规则时会提前触发真实方法执行导致异常,推荐用这种写法:
// 写法2:定义规则时不会触发真实方法执行,适配所有Spy场景
doReturn("firstMockValue").doCallRealMethod().when(myType).func();

规则说明

  • 第一次调用myType.func()时会返回你指定的自定义值
  • 从第二次调用开始,所有请求都会直接执行MyType类中func()的真实代码,和原生Spy逻辑完全一致
  • 如果你的func()方法需要传参,需要保证规则定义时的参数匹配逻辑和实际调用的参数一致,否则Mock规则不会生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:30:05