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

Mockito如何仅Mock部分返回值,其余保留真实值?

基于Mockito的部分方法Mock实现方案

要实现只mock data.getObjectA().getPara1() 的返回值,同时保留 getPara2() 的真实逻辑,核心是用Spy包装真实的ObjectA实例,而不是直接Mock整个ObjectA。下面是具体步骤和代码:

  1. 获取Data里的真实ObjectA实例
ObjectA realObjectA = data.getObjectA();
  1. 基于真实实例创建Spy对象
    Spy会保留原对象的所有真实方法逻辑,只有被指定mock的方法会被替换:
ObjectA spyObjectA = Mockito.spy(realObjectA);
  1. 指定getPara1的返回值为required
    如果getPara1()返回的是Boolean包装类,而required是boolean基本类型,Java会自动装箱,直接写即可;若出现类型不匹配,显式转换为包装类即可:
Mockito.when(spyObjectA.getPara1()).thenReturn(required);
// 类型不匹配时显式转换:thenReturn(Boolean.valueOf(required))
  1. 将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:10:33