Mockito如何仅Mock部分返回值,其余保留真实值?
基于Mockito的部分方法Mock实现方案
要实现只mock data.getObjectA().getPara1() 的返回值,同时保留 getPara2() 的真实逻辑,核心是用Spy包装真实的ObjectA实例,而不是直接Mock整个ObjectA。下面是具体步骤和代码:
- 获取Data里的真实ObjectA实例
ObjectA realObjectA = data.getObjectA();
- 基于真实实例创建Spy对象
Spy会保留原对象的所有真实方法逻辑,只有被指定mock的方法会被替换:
ObjectA spyObjectA = Mockito.spy(realObjectA);
- 指定getPara1的返回值为required
如果getPara1()返回的是Boolean包装类,而required是boolean基本类型,Java会自动装箱,直接写即可;若出现类型不匹配,显式转换为包装类即可:
Mockito.when(spyObjectA.getPara1()).thenReturn(required); // 类型不匹配时显式转换:thenReturn(Boolean.valueOf(required))
- 将Spy对象替换回Data中
如果Data类提供了setObjectA()方法,直接调用即可:
data.setObjectA(spyObjectA);
如果Data没有公开的set方法,用反射强行设置字段:
Field objectAField = Data.class.getDeclaredField("objectA"); objectAField.setAccessible(true); objectAField.set(data, spyObjectA);
常见坑点说明
- 直接Mock整个ObjectA:
Mockito.mock(ObjectA.class)会创建一个空Mock对象,getPara2()会返回默认值(比如null),触发NullPointerException - 直接对真实对象方法打桩:
Mockito.when(data.getObjectA().getPara1()).thenReturn(required)会触发真实的getPara1()方法调用,Mockito无法拦截真实对象的方法,达不到mock效果 - 类型错误:检查
getPara1()的返回类型是否和required一致,显式转换包装类/基本类型即可解决
内容的提问来源于stack exchange,提问作者CCCCos
相关产品推荐
相关产品推荐

