You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:36:02