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

使用Mockito的when().thenReturn()存根方法时出现空指针异常是什么原因?

问题原因及解决方案

核心触发逻辑

你写的存根代码中,when(...)括号内的方法调用会先执行一次再完成存根逻辑,若当前方法无法被Mockito拦截,就会直接运行真实方法体,传入的any()匹配器返回对应类型默认null值,触发空指针异常。

常见原因及对应修复方案

  • 待存根方法是静态方法
    Mockito 默认不支持静态方法的mock,直接调用类名.静态方法的写法无法被拦截,会直接执行真实逻辑。
    修复方案:引入mockito-inline依赖,使用静态类mock的API存根:
    try (MockedStatic<QueryUtils> mockedQueryUtils = Mockito.mockStatic(QueryUtils.class)) {
        mockedQueryUtils.when(() -> QueryUtils.toOrder(any(Sort.class), any(Root.class), any(CriteriaBuilder.class)))
                .thenReturn(mock(List.class));
        // 在此范围内执行测试逻辑即可生效
    }
    
  • 待存根方法是实例方法,调用方是真实对象而非mock对象
    实例方法存根必须基于Mockito生成的mock对象调用,若用自己new出来的QueryUtils真实实例调用方法,Mockito无法拦截,会直接执行真实逻辑。
    修复方案:用Mockito生成QueryUtils的mock对象,基于mock对象做存根:
    QueryUtils mockQueryUtils = Mockito.mock(QueryUtils.class);
    when(mockQueryUtils.toOrder(any(Sort.class), any(Root.class), any(CriteriaBuilder.class)))
            .thenReturn(mock(List.class));
    
  • 待存根方法被final修饰
    Mockito 默认无法mock final方法,拦截失败会执行真实逻辑。
    修复方案:引入mockito-inline依赖,即可支持final方法的mock能力,存根写法和普通实例方法一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:06:04