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
相关产品推荐
相关产品推荐

