使用@InjectMocks时构造器调用Mock依赖报空指针如何解决
问题根因
空指针异常由两个问题共同触发:
@InjectMocks会在初始化Mock阶段触发Demo类的实例化,而Demo构造函数中直接调用了repository.getValue(),此时你还没有对Mock的repository对象的对应方法进行打桩,Mockito对未打桩的对象方法默认返回null。Demo类的attr属性是基本数据类型long,getValue()返回的是Long包装类,null拆箱为基本类型时会直接抛出空指针异常。
解决方案
不要依赖@InjectMocks自动实例化Demo,调整初始化顺序:先初始化Mock对象、完成方法打桩后,再手动构造Demo实例即可。
修正后的测试代码如下:
import org.mockito.Mock; import org.mockito.MockitoAnnotations; import static org.mockito.Mockito.when; public class DemoTest { @Mock private Repository repository; private Demo demo; @BeforeEach void setUp() { // 初始化Mock对象 MockitoAnnotations.openMocks(this); // 对repository的getValue方法打桩,设置测试需要的返回值 when(repository.getValue()).thenReturn(100L); // 打桩完成后手动构造Demo实例 demo = new Demo(repository); } }
注意事项
- 新版本Mockito中
MockitoAnnotations.initMocks(this)已废弃,推荐使用MockitoAnnotations.openMocks(this)替代。 - 原测试代码中无关的
registrationUtil = new RegistrationUtil();如果没有实际作用可以删除,避免多余逻辑干扰测试。
内容的提问来源于stack exchange,提问作者Khan Hafizur Rahman
相关产品推荐
相关产品推荐

