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

使用JUnit5和Mockito存根方法时遇到空指针异常(NPE)

JUnit5 + Mockito 存根时空指针异常(NPE)排查方案

常见原因及解决办法

1. createTenantMockObject() 返回 null

代码中使用Optional.of(createTenantMockObject()),如果createTenantMockObject()返回null,Optional.of()会直接抛出NPE。

  • 解决:检查createTenantMockObject()实现,确保返回有效的Tenant实例(Mockito mock对象或真实对象均可):
    private Tenant createTenantMockObject() {
        return Mockito.mock(Tenant.class); // 或根据业务需求new Tenant()
    }
    

2. DemoService.detailedStatus 方法内部未安全处理Optional

即使存根了非空的Optional,若detailedStatus中直接调用tenantOptional.get()且存根匹配失败(返回空Optional),会触发NPE。

  • 解决:
    • 确认存根参数与detailedStatus中调用findByMtuNumber的参数完全一致(比如你存根的是"MTU2",实际调用也必须传这个值);
    • 在DemoService中用Optional.ifPresent()或orElseThrow()替代直接get(),做安全处理。

3. Mock对象未正确注入

虽然使用了@InjectMocks和@Mock,仍可能出现注入失败:

  • DemoService的注入方式有问题:比如构造方法未包含DemoRepository参数,或私有字段无setter导致Mockito无法注入,最终demoService中的demoRepository为null;
  • 测试类名拼写错误(当前是dmeoStatusServiceTest,少了一个m),虽不影响注入,但建议修正为规范的DemoStatusServiceTest。
  • 解决:
    • 检查DemoService的注入逻辑:构造方法注入需确保参数包含DemoRepository,字段注入Mockito默认支持私有字段反射注入;
    • 在测试方法开头添加断言验证对象非空:
      assertNotNull(demoRepository);
      assertNotNull(demoService);
      

4. 存根语法不匹配

若存根的方法签名、参数类型与实际调用不一致,Mockito会返回默认值(Optional类型默认返回Optional.empty()),后续调用get()会抛出NPE。

  • 解决:核对存根的findByMtuNumber方法参数类型、值,确保和detailedStatus中的调用完全一致。

额外建议

  • 开启Mockito严格模式:在测试类上添加@MockitoSettings(strictness = Strictness.STRICT_STUBS),存根未被调用或调用未存根方法时会抛出明确异常,便于定位问题;
  • 使用BDDMockito语法提升可读性:given(demoRepository.findByMtuNumber("MTU2")).willReturn(tenantOptional);

内容的提问来源于stack exchange,提问作者Deep Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:11:37