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

