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

