Mockito使用when/thenReturn给spy对象打桩触发真实方法抛NPE问题
问题根因
你遇到的空指针是Mockito的spy对象打桩语法特性导致的:
- spy是基于真实类实例生成的代理对象,和完全虚拟的普通mock对象不同,spy默认会执行方法的真实逻辑
- 当你使用
when(spy.方法(参数匹配器)).thenReturn(返回值)的语法打桩时,when括号内的spy.方法(...)会真实执行一次,此时参数匹配器eq()/any()对应的实际入参为null,直接触发你代码中遍历cookies的空指针异常。
修复方案
直接替换打桩语法即可,使用doReturn().when()的写法,该语法不会触发方法的真实执行:
// 删掉原来的when().thenReturn()代码,替换为下面的写法 doReturn(fakeCookieList).when(theSpy).mergeList(eq(aCookieList), any(HttpCookie.class));
注意事项
- 给spy对象打桩优先选择
doReturn/when、doThrow/when这类语法,避免触发不必要的真实逻辑 - 普通mock对象因为默认无方法真实实现,所以即使使用
when().thenReturn()也不会出现这类问题
内容的提问来源于stack exchange,提问作者lannyf
相关产品推荐
相关产品推荐

