JUnit测试中Mock类方法无法执行引发空指针异常(NPE)的问题求助
解决JUnit Mock时方法未执行且出现NPE的问题
嘿,我一眼就瞅出问题所在啦!你遇到的空指针异常和Mock方法没被触发的核心原因,是参数匹配不匹配。
问题根源分析
看你的测试代码:
@Test void func(){ when(someclass.getInfo(randomUUID().toString())).thenReturn(userinfo); UserInfo userInfo = sample.func(randomUUID().toString()); // 使用断言进行比较 }
你在Mock getInfo 方法时,传入的是一个随机生成的UUID字符串;但调用sample.func()时,又生成了另一个全新的随机UUID。这两个字符串完全不一样啊!Mockito的参数匹配是严格的——只有当传入的参数和你Stub时的参数完全一致,才会触发你设置的返回值。因为匹配不上,所以getInfo返回了默认的null,自然就抛出NPE了。
几种解决方案
根据你的测试需求,有以下几种修复方式:
1. 匹配任意字符串(适合不关心具体id的场景)
如果你不管传入什么id,都希望返回mock的userinfo,可以用Mockito的anyString()匹配器:
import static org.mockito.ArgumentMatchers.anyString; @Test void func(){ when(someclass.getInfo(anyString())).thenReturn(userinfo); UserInfo userInfo = sample.func(randomUUID().toString()); // 断言逻辑 }
这样只要传入的是非null的字符串,都会触发Stub的返回值。
2. 复用同一个UUID(适合需要验证特定参数的场景)
如果你的测试需要验证特定id的处理逻辑,那就把生成的UUID提前存下来,在Stub和调用时复用:
@Test void func(){ // 先生成一次并保存 String testId = randomUUID().toString(); // 用保存的id做Stub when(someclass.getInfo(testId)).thenReturn(userinfo); // 调用时传入同一个id UserInfo userInfo = sample.func(testId); // 断言逻辑 // 还可以验证方法是否被正确调用了 verify(someclass, times(1)).getInfo(testId); }
3. 如果你想真的执行SomeClass的getInfo方法(非Mock场景)
要是你其实希望触发SomeClass中getInfo的真实逻辑,那应该用spy而不是mock:
// 替换mock为spy SomeClass someclass = spy(new SomeClass()); // 如果你想部分Mock(比如某个特定参数返回自定义值,其他走真实逻辑): when(someclass.getInfo(anyString())).thenReturn(userinfo);
额外小提示
记得在测试类里导入Mockito的静态方法,不然mock()、when()、anyString()这些方法会报错哦:
import static org.mockito.Mockito.*; import static org.mockito.ArgumentMatchers.*;
内容的提问来源于stack exchange,提问作者harry123
相关产品推荐
相关产品推荐

