Mockito单元测试依赖类属性时遇空指针异常求助
解决Mockito单元测试中构造器引发的NullPointerException
从你的报错信息来看,空指针直接出现在FlightReservation的构造器第25行,这说明你的构造器里正在使用某个未初始化的依赖对象——你想通过Mockito模拟这个非被测的依赖,但显然没把模拟对象正确注入到被测的FlightReservation实例里,导致构造阶段就触发了空指针。
常见问题排查与解决步骤
1. 先定位构造器里的问题代码
打开FlightReservation.java第25行,大概率是构造器里调用了某个依赖类(比如FlightDao、PaymentService这类你想Mock的类)的方法或属性,但这个依赖对象此时是null。举个典型的例子:
public class FlightReservation { private final FlightService flightService; public FlightReservation() { // 这里如果没给flightService赋值,或者测试时没替换成Mock实例 this.flightService.checkAvailability(); // 第25行调用null对象的方法,直接空指针 } }
2. 用Mockito正确注入构造器依赖
根据你的依赖注入方式,选对应的Mock注入方法:
方式一:手动传入Mock实例
如果你的FlightReservation是通过构造器接收依赖,直接在测试里把Mock对象传进去就行:
import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; public class FlightReservationTest { // 模拟你不想测试的依赖类 @Mock private FlightService mockFlightService; @Test public void testFlightReservation_ParaConstructor() { // 初始化所有@Mock注解的对象 MockitoAnnotations.openMocks(this); // 把Mock对象传入被测类的构造器 FlightReservation reservation = new FlightReservation(mockFlightService); // 接下来写你的测试逻辑就行 // 比如验证mockFlightService的方法是否被调用等 } }
方式二:用@InjectMocks自动注入
如果依赖关系比较多,用@InjectMocks可以自动把标注了@Mock的依赖注入到被测类实例中(支持构造器注入、Setter注入等):
import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; public class FlightReservationTest { @Mock private FlightService mockFlightService; // 自动把所有@Mock的依赖注入到这个实例里 @InjectMocks private FlightReservation flightReservation; @Test public void testFlightReservation_ParaConstructor() { MockitoAnnotations.openMocks(this); // 直接使用flightReservation测试即可,它的依赖已经被Mock填充 } }
3. 优化构造器设计(可选但推荐)
如果你的构造器里直接执行了依赖的业务逻辑(比如第25行的checkAvailability()调用),这其实是不太好的设计——构造器应该只做初始化,别包含业务逻辑。把业务逻辑移到单独的方法里,测试时更容易控制Mock行为,也能避免构造阶段触发空指针:
public class FlightReservation { private final FlightService flightService; // 只做初始化,不碰业务逻辑 public FlightReservation(FlightService flightService) { this.flightService = flightService; } // 把原来构造器里的业务逻辑移到这里 public boolean verifyFlightAvailability() { return this.flightService.checkAvailability(); } }
最后必检查的点
- 确保所有
@Mock标注的对象都被初始化了:要么用MockitoAnnotations.openMocks(this),要么在测试类上标注@RunWith(MockitoJUnitRunner.class) - 确认被测类的构造器依赖的所有对象都被Mock并注入,没有遗漏的
null依赖
内容的提问来源于stack exchange,提问作者user3599649
相关产品推荐
相关产品推荐

