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

Spring Boot测试中@Autowired注入的Service仅单个方法抛空指针异常如何解决

问题根因

不存在“Service部分自动注入”的情况,另外两个测试方法运行正常可以证明documentsService已经被成功注入,本次空指针异常是Mockito桩设置不符合实际调用规则导致的:
你在whenCreateDocument_ReturnDocument测试方法中,给documentsRepo.save设置的桩规则是仅当入参等于你手动构造的entityDoc实例时,才返回预设的entityDoc。但实际业务代码中,uploadFile方法调用save时传入的参数,是transformDocumentToEntity方法根据传入的docVo新构造出来的Documento实例,该实例和你测试类中构造的entityDoc不是同一个对象,且Documento类没有重写equals方法,Mockito默认按对象地址匹配参数,因此桩规则命中失败,documentsRepo.save返回null。
后续VoBuilderFactory.getDocumentoVoBuilder(null)执行时触发空指针,异常栈的最外层刚好对应测试类中调用uploadFile的行,就造成了是documentsService为空的错觉。
而whenFindDocumentById_ReturnDocument方法没有出现问题,是因为findById的入参是Long类型,Long作为JDK内置包装类已经重写了equals方法,参数值一致就能命中桩规则,因此运行正常。

解决方案

二选一即可:

  • 调整Mockito桩的参数匹配规则,使用任意类匹配替换固定实例匹配:
    将原桩代码
    when(documentsRepo.save(entityDoc)).thenReturn(entityDoc);
    
    替换为
    // 需导入org.mockito.ArgumentMatchers.any
    when(documentsRepo.save(any(Documento.class))).thenReturn(entityDoc);
    
  • 给Documento实体类重写equals和hashCode方法,让属性一致的Documento实例判定为相等,原有桩规则即可正常命中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 04:24:00