使用Mockito设置Mock时触发空指针异常:double类型参数匹配问题
解决Mockito Mock对象时的Double拆箱空指针异常
我太懂这个坑了!你碰到的NullPointerException本质是基本类型拆箱时的空指针问题,咱们来理清楚原因和解决办法:
问题根源
你的method方法需要两个double基本类型参数,但你用了any()作为匹配器——Mockito的any()默认返回的是null(因为它是针对Object类型的匹配器)。当JVM试图把这个null的Double包装类自动拆箱成double基本类型时,就会调用doubleValue()方法,而null对象调用方法必然触发NPE,也就是你看到的异常:
java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
快速解决方案
把匹配器换成Mockito专门为基本类型设计的anyDouble(),它会返回一个合法的double值(默认是0.0),不会触发拆箱问题。修改后的代码如下:
Mockito.when(aMock.method(anyDouble(), anyDouble())).thenReturn(something);
额外检查点
还要确认something的合法性:
- 如果
method的返回值是double基本类型,那thenReturn里的something绝对不能是null,否则返回时同样会触发拆箱NPE,必须传入一个有效的double值(比如0.0、1.5等) - 如果
method返回的是Double包装类型,那something可以是null,但要确保业务逻辑允许这种情况
避坑小贴士
Mockito的匹配器要和参数类型严格对应:
- 匹配
int用anyInt() - 匹配
long用anyLong() - 匹配
boolean用anyBoolean()
别再用any()来匹配基本类型啦,大概率会踩拆箱的坑!
内容的提问来源于stack exchange,提问作者Martin Melka
相关产品推荐
相关产品推荐

