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

Mockito无法Mock字段引发空指针异常,寻求解决方案

问题原因

你在测试类的setUp方法里犯了个关键错误:先通过MockitoAnnotations.openMocks(this)让Mockito处理@InjectMocks和@Mock注解,这时候Mockito已经为classToBeTested创建了实例并尝试注入依赖,但紧接着你又手动new了一个ClassToBeTested实例覆盖了它。这个手动创建的实例里,只有构造函数传入的serviceOne被赋值,而serviceTwo是字段注入的,没有任何途径被赋值,自然是null,调用它的方法就会触发空指针异常。

解决方案

有三种可行的修复方式,选一种就行:

方式1:移除手动实例化代码

直接删掉classToBeTested = new ClassToBeTested(serviceOne);这行,让@InjectMocks负责创建和注入所有依赖:

@BeforeEach
public void setUp() {
  MockitoAnnotations.openMocks(this);
  // 去掉手动new的代码
}

方式2:手动注入serviceTwo

如果一定要手动实例化,那就在new之后把mock的serviceTwo赋值给classToBeTested的字段:

@BeforeEach
public void setUp() {
  MockitoAnnotations.openMocks(this);
  classToBeTested = new ClassToBeTested(serviceOne);
  classToBeTested.serviceTwo = serviceTwo; // 手动注入mock的serviceTwo
}

方式3:改用全构造函数注入(推荐)

修改ClassToBeTested,把serviceTwo也放到构造函数里注入,避免字段注入的弊端:

public class ClassToBeTested extends MyAbstarctClass implements MyInterface {
  
  private final ServiceOne serviceOne;
  private final ServiceTwo serviceTwo;

  @Autowired
  public ClassToBeTested(ServiceOne serviceOne, ServiceTwo serviceTwo){
    this.serviceOne = serviceOne;
    this.serviceTwo = serviceTwo;
  }
  
  // 其他代码不变
}

然后测试类里手动实例化时传入两个mock:

@BeforeEach
public void setUp() {
  MockitoAnnotations.openMocks(this);
  classToBeTested = new ClassToBeTested(serviceOne, serviceTwo);
}

这种方式不仅能解决测试问题,还能让依赖关系更清晰,避免空指针风险。

内容的提问来源于stack exchange,提问作者Dibyajyoti Behera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:07:01