实例化含Mock对象的类时触发NullPointerException问题求助
排查Mockito初始化Mock对象时触发NullPointerException的问题
我来帮你分析下这个在实例化myObj时触发的NullPointerException问题,结合你的代码来看,主要可能是以下几个原因:
可能的原因
- @Mock注解的字段缺少类型声明:你的代码里
@Mock标注的字段只写了变量名(比如private constructorarg1;),这在Java中是不合法的,编译阶段就会报错,更别说运行时了。即使是你简写了,实际代码中有类型,也要确保这些类型是Mockito可以Mock的(比如接口、非final类,Mockito默认不能Mock final类)。 - Mock对象未被正确初始化:虽然你调用了
MockitoAnnotations.initMocks(this),但如果这个方法没有被正确执行(比如TestNG的@BeforeMethod注解配置有误,或者测试类的生命周期问题),那标注@Mock的字段还是会是null,传入myObj构造器时自然会触发NPE。 - 父类构造函数的非空校验/方法调用:如果
myObj1的构造函数中直接调用了传入参数的方法(比如arg1.someMethod()),而此时arg1因为Mock失败为null,就会立刻抛出NPE。 - Mockito不支持Mock final类(未配置):如果
constructorarg1/constructorarg2/constructorarg3的类型是final类,Mockito默认无法生成Mock实例,会导致这些字段为null。
对应的解决方法
- 补全@Mock字段的类型声明:确保每个Mock字段都有明确的类型,比如:
@Mock private Arg1 constructorarg1; @Mock private Arg2 constructorarg2; @Mock private Arg3 constructorarg3; - 改用更可靠的Mockito注解初始化方式:手动调用
MockitoAnnotations.initMocks(this)容易出问题,推荐用测试框架的扩展来自动处理:- 如果你用JUnit 4:给测试类加上
@RunWith(MockitoJUnitRunner.class)注解,去掉手动初始化的代码。 - 如果你用JUnit 5:给测试类加上
@ExtendWith(MockitoExtension.class)注解。
示例(JUnit 5):
@ExtendWith(MockitoExtension.class) public class MyTestClass { @Mock private Arg1 constructorarg1; @Mock private Arg2 constructorarg2; @Mock private Arg3 constructorarg3; private myObj myObj; @BeforeMethod public void init() { myObj = new myObj(constructorarg1, constructorarg2, constructorarg3); } } - 如果你用JUnit 4:给测试类加上
- 检查父类构造函数逻辑:如果父类
myObj1的构造函数对传入参数有非空要求,或者直接调用了参数的方法,要确保Mock对象已经被正确初始化。可以在init方法中先打印Mock对象的引用,确认不是null。 - 配置Mockito支持final类Mock:如果需要Mock final类,在
src/test/resources/mockito-extensions目录下创建名为org.mockito.plugins.MockMaker的文件,文件内容仅写:
同时确保你的Mockito版本在2.10.0以上(推荐3.x及更高版本)。mock-maker-inline
内容的提问来源于stack exchange,提问作者wxcoder
相关产品推荐
相关产品推荐

