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

使用Mockito mock方法返回值时得到null值如何解决

问题原因
  • 核心错误是你用mock(Foo.class)创建的是完整的Mock代理对象,这类对象默认不会执行任何方法的真实业务逻辑,所有方法调用会直接返回类型默认值:引用类型返回null,基本类型返回0/false等默认值。你在测试里调用foo.function1(1,2)时,根本没有执行function1内部调用function2的逻辑,直接返回了null,这就是actualResult为null的直接原因。
  • 你贴的被测类Foo的function1方法本身存在语法缺陷:方法声明返回值为ReturnParameters,但方法体内仅调用了function2(a,b),没有写return语句返回结果,就算测试逻辑写对,这段代码本身也无法通过编译。
解决方法

你要测试function1的真实逻辑、仅Mock同类中的function2方法,不能用全量Mock,要用Spy(部分Mock)实现,步骤如下:

  1. 先修正被测类Foo的function1方法,补全return逻辑:
class Foo {
    ReturnParameters function1(int a, int b) {
        // 补全return,返回function2的执行结果
        return function2(a, b);
    }

    ReturnParameters function2(int a , int b) {
        // 方法原有逻辑
        return new ReturnParameters(0);
   }
}
  1. 调整测试类,将全Mock替换为Spy实例,打桩内部方法时使用doReturn().when()语法避免触发function2的真实调用:
import org.junit.Test;
import org.mockito.Mockito;
import static org.junit.Assert.assertEquals;

class FooTest{
    // 创建Spy实例:默认执行方法真实逻辑,仅对打桩的方法做Mock处理
    Foo foo = Mockito.spy(new Foo());

    @Test
    public void function1test(){
        // 打桩function2方法,入参为1、2时返回指定结果
        Mockito.doReturn(new ReturnParameters(100)).when(foo).function2(1,2);
        ReturnParameters actualResult = foo.function1(1,2);
        int expectedResult = 100;
        assertEquals(expectedResult , actualResult.getStatus());
    }
}

注意:打桩Spy对象的方法时不要用Mockito.when(foo.function2(1,2)).thenReturn(...)写法,因为这种写法会先真实执行一次function2,若function2依赖未初始化的外部资源会直接报错,doReturn写法可以跳过真实方法执行,更适合内部方法打桩的场景。

如果你坚持要用全Mock实现,也可以额外配置function1走真实方法,但这种写法需要为每个要测试的真实方法单独配置,维护成本高,不推荐:

class FooTest{
    Foo foo = Mockito.mock(Foo.class);

    @Test
    public void function1test(){
        // 配置function1走真实逻辑
        Mockito.when(foo.function1(1,2)).thenCallRealMethod();
        Mockito.when(foo.function2(1,2)).thenReturn(new ReturnParameters(100));
        ReturnParameters actualResult = foo.function1(1,2);
        int expectedResult = 100;
        assertEquals(expectedResult , actualResult.getStatus());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:48:35