【问题标题】:Nullpointer when using Mockito for unit tests使用 Mockito 进行单元测试时的空指针
【发布时间】:2020-04-20 16:30:02
【问题描述】:

我正在为我的应用程序创建一个 Spring Boot API。我正在尝试使用 mockito 对我的服务实现进行单元测试来模拟细节。该服务将向数据库添加一个新的建筑实体。下面是服务实现和测试实现。 建筑服务:

@Slf4j
@Service
public class BuildingServiceImpl implements BuildingService {

private BuildingRepository buildingRepository;
private BuildingRequestToEntityMapper buildingRequestToEntityMapper;

public BuildingServiceImpl(BuildingRepository buildingRepository, BuildingRequestToEntityMapper 
buildingRequestToEntityMapper){
this.buildingRepository=buildingRepository;
this.buildingRequestToEntityMapper=buildingRequestToEntityMapper;
}

public HttpStatus addBuilding(BuildingRequest buildingRequest){
    log.info("Inside addBuilding() service");
    BuildingEntity buildingEntity = buildingRequestToEntityMapper.map(buildingRequest);
    buildingRepository.save(buildingEntity);
    log.info("Building saved "+ buildingEntity);
    return HttpStatus.CREATED;
}

BuildingServiceImpl_UT

@RunWith(MockitoJUnitRunner.class)
public class BuildingServiceImpl_UT {

@Mock
BuildingRequestToEntityMapper buildingRequestToEntityMapper;

@Mock
BuildingRepository buildingRepository;

@InjectMocks
BuildingServiceImpl buildingServiceImpl;

@Test
public void buildingService_MapsRequest_AndSaveEntity(){
BuildingRequest buildingRequest = BuildingRequest.builder()
            .name("TestName")
            .telephone("4444444444")
            .postcode("TEst")
            .address("testAddress").build();

   when(buildingServiceImpl.addBuilding(any(BuildingRequest.class))).thenReturn(HttpStatus.CREATED);
    when(buildingRepository.save(any(BuildingEntity.class))).thenReturn(new BuildingEntity());

    buildingServiceImpl.addBuilding(buildingRequest);
    verify(buildingRepository, times(1)).save(any());
}

我已经模拟了映射器和存储库并将它们注入到服务中,但是当我运行测试时,我在测试类中的第一个 when().thenReturn() 语句处得到一个空指针异常。请提供任何帮助。谢谢

【问题讨论】:

  • 从测试中删除 when(buildingServiceImpl.addBuilding(any(BuildingRequest.class))).thenReturn(HttpStatus.CREATED); 行。

标签: java spring-boot junit mockito


【解决方案1】:

我不明白你的第一个when().thenReturn()!您尝试在 buildingServiceImpl 上执行此操作,这不是模拟!此外,这毫无意义,因为您想测试此方法! 我认为你应该为模拟 buildingRequestToEntityMapper 定义一个 when().thenReturn(),但在你的实现中你不需要为 buildingRequestToEntityMapper.map() 定义一个返回值>。在这种情况下,变量 buildingEntity 的值将是 null,它应该在您的测试用例中起作用。

@RunWith(MockitoJUnitRunner.class)
public class BuildingServiceImpl_UT {

@Mock
BuildingRequestToEntityMapper buildingRequestToEntityMapper;

@Mock
BuildingRepository buildingRepository;

@InjectMocks
BuildingServiceImpl buildingServiceImpl;

    @Test
    public void buildingService_MapsRequest_AndSaveEntity(){
    BuildingRequest buildingRequest = BuildingRequest.builder()
                .name("TestName")
                .telephone("4444444444")
                .postcode("TEst")
                .address("testAddress").build();


        when(buildingRepository.save(any(BuildingEntity.class))).thenReturn(new BuildingEntity());

        buildingServiceImpl.addBuilding(buildingRequest);
        verify(buildingRepository, times(1)).save(any());
        verify(buildingRequestToEntityMapper).map(any());
    }

【讨论】:

    【解决方案2】:

    这个:

    when(buildingServiceImpl.addBuilding(any(BuildingRequest.class))).thenReturn(HttpStatus.CREATED);
    

    不是必须的,你要测试方法:addBuilding 不要模拟它。

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多