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

使用Mockito.spy测试Service类调用真实方法报空指针问题求助

问题根因汇总

你遇到的空指针以及mock不生效的问题由以下几个错误共同导致:

  • 注解不匹配导致service未初始化
    如果你使用的是JUnit 5版本,@Before注解已经被废弃,替换为@BeforeEach,原@Before标注的setup方法不会执行,导致service成员变量没有被赋值,调用时自然抛出空指针。
    如果你使用的是JUnit 4版本,需要在测试类上增加@RunWith(MockitoJUnitRunner.class)注解,确保Mockito相关初始化逻辑正常执行。
  • 方法名大小写不匹配
    Service类中mainMethodToTest内部调用的是getImportantValues()(I大写),但你实际定义以及mock的是getimportantValues()(i小写),二者属于完全不同的方法,mock逻辑根本不会触发。
  • 语法错误
    • Service类中的getimportantValues()方法缺少返回值类型定义,应该补全为public List<A> getimportantValues()
    • setup方法中实例化Service时缺少括号,正确写法是service = Mockito.spy(new Service());
    • List是接口不能直接实例化,doReturn(new List<A>())写法错误,需要返回具体实现类比如new ArrayList<A>()

修复后的参考代码

Service类

class Service {
    public List<A> mainMethodToTest() {
        // 调用另一个方法获取值
        List<A> list = getImportantValues();
        // 处理list逻辑
        return list; 
    }
    // 修正方法名和返回值类型,和调用处保持大小写一致
    public List<A> getImportantValues() {
        return new ArrayList<>();
    }
}

测试类(JUnit 5版本)

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.assertNotNull;

class TestService {
    private Service service;

    @BeforeEach
    public void setup() {
        // 修正实例化语法
        service = Mockito.spy(new Service());
    }

    @Test
    public void testMainMethodToTest() {
        // mock的方法名和实际调用保持一致,返回ArrayList实例
        Mockito.doReturn(new ArrayList<A>()).when(service).getImportantValues();
        assertNotNull(service.mainMethodToTest());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:48:01