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

Mockito单元测试空指针异常:MyClass方法测试失败求助

问题解决:单元测试NullPointerException修复

你的测试抛出空指针异常的核心原因是:直接调用了MyClass的真实otherMethod方法,而该方法缺少正确的Mock依赖支持,返回了null,后续调用getOSRevision()自然触发空指针。另外你的测试代码还存在语法错误和参数不匹配问题,下面给出两种修复方案:

方案一:完善依赖链Mock(推荐,贴近真实调用逻辑)

这种方案会完整模拟otherMethod内部的调用流程,让真实的otherMethod能返回Mock的OtherMethod对象:

修改后的测试代码:

public class MyClassTest {
    @Mock
    private MyClient myClient;

    @Mock
    private MyMethodRevisionCall myMethodRevisionCall;

    @Mock
    private OtherMethod otherMethod;
    
    private MyClass myClass;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.initMocks(this);
        when(myClient.newMyMethodRevisionCall()).thenReturn(myMethodRevisionCall);
        // 模拟call方法返回mock的OtherMethod对象
        when(myMethodRevisionCall.call(any(someObject.class))).thenReturn(otherMethod);
        // 模拟getOSRevision的返回值
        when(otherMethod.getOSRevision()).thenReturn("TestString");
        myClass = new MyClass(myClient);
    }

    @Test
    public void test_myMethod() {
        // 调用被测试方法,保持参数与mock逻辑一致
        final String result = myClass.myMethod("hostName");
        
        // 验证结果符合预期
        assertEquals("TestString", result);
        // 验证call方法被调用1次
        verify(myMethodRevisionCall, times(1)).call(any(someObject.class));
    }
}

方案二:直接Mock MyClass的otherMethod方法

如果不想模拟内部调用链,也可以直接MockotherMethod的返回值,需要用@Spy注解包装MyClass对象:

public class MyClassTest {
    @Mock
    private MyClient myClient;

    @Mock
    private OtherMethod otherMethod;
    
    // 使用Spy包装真实的MyClass对象
    @Spy
    private MyClass myClass;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.initMocks(this);
        // 注入myClient依赖
        myClass = new MyClass(myClient);
        // 模拟otherMethod返回mock的OtherMethod对象
        doReturn(otherMethod).when(myClass).otherMethod("hostName");
        // 模拟getOSRevision的返回值
        when(otherMethod.getOSRevision()).thenReturn("TestString");
    }

    @Test
    public void test_myMethod() {
        final String result = myClass.myMethod("hostName");
        
        assertEquals("TestString", result);
        verify(myClass, times(1)).otherMethod("hostName");
    }
}

关键细节提示

  1. 原测试中myClass.myMethod("TestString")的参数与Mock逻辑中的"hostName"不匹配,会导致Mock失效,需保持参数一致。
  2. 原测试的verify语句存在括号未闭合的语法错误,修复时需补全调用方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:06:25