编写指定业务方法的JUnit测试时遇空指针异常,如何解决?
问题排查与解决
业务方法代码
public List<PartGEntity> getBEntityId(List<GBEntityDTO> gBEntities, BigInteger partId) { List<PartGEntity> partGEntityList = new ArrayList<>(); if(!CollectionUtils.isEmpty(gBEntities)) { gBEntities.forEach(gBEntityDTO -> { PartGEntity partGEntity = createPartGEntity( statClient.getBEntityByAnetId(gBEntityDTO.getAnetId())); partGEntity.setPartyId(partyId); // 注意:此处参数为partId,但代码写为partyId,疑似笔误 partGEntityList.add(partGEntity); }); } return partGEntityList; }
测试代码片段
BEntityDTO bEntityByAnetId = new BEntityDTO(); bEntityByAnetId.setAnetId("5738"); bEntityByAnetId.setEffectiveDate(new Date()); when(statClient.getBEntityByAnetId("5738")).thenReturn(bEntityByAnetId); when(partGEntityDS.getBEntityId(newBEntityList,partId)).thenReturn(partGEntityList);
空指针异常排查方向
1. 验证statClient的Mock是否正确注入
若statClient未正确注入到被测业务类实例中,调用statClient.getBEntityByAnetId()会直接触发空指针:
- 确保测试类中用
@Mock声明statClient,用@InjectMocks注入到业务类实例,或手动设置:@Mock private StatClient statClient; @InjectMocks private YourBusinessService businessService; // 替换为你的业务类名称 - JUnit4需在测试方法开头初始化Mock:
MockitoAnnotations.openMocks(this);JUnit5需添加@ExtendWith(MockitoExtension.class)注解。
2. 检查Mock的参数匹配是否命中
如果gBEntityDTO.getAnetId()返回的字符串与Mock的"5738"不匹配,Mock会返回null,导致createPartGEntity处理空值时抛出异常:
- 先改用任意字符串匹配验证:
若异常消失,说明参数值不匹配,检查when(statClient.getBEntityByAnetId(anyString())).thenReturn(bEntityByAnetId);newBEntityList中GBEntityDTO的anetId是否确实为"5738"。
3. 排查createPartGEntity方法的空值处理
若statClient.getBEntityByAnetId()返回null(Mock未命中或主动返回null),且createPartGEntity未做入参空校验,直接调用入参方法会触发空指针:
- 暂时让Mock返回非空值,或给
createPartGEntity添加空值校验;若该方法是测试目标,需确保其能正确处理空入参,或在业务逻辑中先判断返回值是否为null再调用。
4. 修正业务方法中的笔误
业务方法里partGEntity.setPartyId(partyId)存在参数名错误:方法参数为partId,但代码写为partyId。若partyId是未初始化的类成员变量,后续操作可能触发异常,建议修正为partId。
内容的提问来源于stack exchange,提问作者vr3w3c9
相关产品推荐
相关产品推荐

