Mockito如何仅mock方法第一次调用,其余调用保留原有逻辑不做处理
实现方案
首先你需要确保myType是Mockito的Spy对象而非普通Mock对象,只有Spy对象才支持调用目标类的真实逻辑,创建Spy的代码如下:
MyType myType = Mockito.spy(new MyType());
你之前尝试用doNothing()不生效,是因为doNothing()仅适用于无返回值的void方法,有返回值的方法要走真实逻辑需要用thenCallRealMethod()相关API,有两种常用写法可以实现「仅第一次调用走Mock逻辑,后续调用走真实逻辑」的需求:
- 链式调用
thenCallRealMethod()
// 写法1:适合无副作用的方法,定义规则时不会提前触发真实方法执行的场景 when(myType.func()).thenReturn("firstMockValue").thenCallRealMethod();
- 改用
doReturn系列方法(更推荐用于Spy对象)
如果你的func()方法有副作用,用when定义规则时会提前触发真实方法执行导致异常,推荐用这种写法:
// 写法2:定义规则时不会触发真实方法执行,适配所有Spy场景 doReturn("firstMockValue").doCallRealMethod().when(myType).func();
规则说明
- 第一次调用
myType.func()时会返回你指定的自定义值 - 从第二次调用开始,所有请求都会直接执行
MyType类中func()的真实代码,和原生Spy逻辑完全一致 - 如果你的
func()方法需要传参,需要保证规则定义时的参数匹配逻辑和实际调用的参数一致,否则Mock规则不会生效
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

