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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:14