Mockito.mock失效,调用Mockito.when触发NullPointerException问题排查
类A Mock时触发NPE的可能原因及排查方向
类A重写的
toString()存在空指针风险
打印mock实例时抛出NPE,说明调用toString()时访问了未初始化的成员。Mockito生成的mock不会自动初始化原类的成员变量,如果类A自定义的toString()里引用了这些未初始化的变量,就会触发空指针。doX()是final/static/private方法
Mockito默认无法拦截final、static、private方法的调用。当执行when(a.doX()).thenReturn("X")时,会直接调用原方法,如果原方法内部存在null引用,就会抛出NPE。这种情况需要使用Mockito-inline扩展来支持mock这类特殊方法。类A的静态初始化块或构造函数有异常逻辑
虽然Mockito创建mock时不会完全执行构造函数,但类A的静态初始化块如果有强制初始化依赖对象的逻辑,而mock无法提供这些依赖,会导致mock实例内部状态异常,后续调用方法时触发空指针。类A被其他字节码增强工具修改
若类A被Lombok、AspectJ、Spring AOP等工具做过字节码增强,可能和Mockito的代理生成机制冲突,导致mock实例不完整,调用方法时出现NPE。Mockito全局配置被篡改
如果自定义了Mockito的MockMaker或其他全局mock策略,可能导致针对类A的mock生成失败,无法创建正常的代理实例。
排查建议
- 临时注释类A的
toString()重写代码,测试打印mock实例是否正常。 - 检查
doX()的方法修饰符,若为final/static,添加Mockito-inline依赖后重试。 - 排查类A的静态代码块和构造函数,移除或修改可能导致null的逻辑。
- 暂时移除类A相关的字节码增强依赖,验证mock是否能正常工作。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

