使用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类中的
修复后的参考代码
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
相关产品推荐
相关产品推荐

