Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Mockito进行单元测试时使用空指针_Java_Spring Boot_Junit_Mockito - Fatal编程技术网

Java 使用Mockito进行单元测试时使用空指针

Java 使用Mockito进行单元测试时使用空指针,java,spring-boot,junit,mockito,Java,Spring Boot,Junit,Mockito,我正在为我的应用程序创建一个spring引导API。我试图使用mockito对我的服务实现进行单元测试,以模拟细节。该服务将向数据库中添加新的建筑实体。下面是服务实现和测试实现。 屋宇装备: @Slf4j @Service public class BuildingServiceImpl implements BuildingService { private BuildingRepository buildingRepository; private BuildingRequestToEnt

我正在为我的应用程序创建一个spring引导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\u 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);

没有必要,您要测试方法:
addBuilding
不要模拟它。

我不明白您的第一个when()。然后返回()!您尝试在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());
    }
当(buildingservicecimpl.addBuilding(any(BuildingRequest.class)))时删除
,然后返回(HttpStatus.CREATED)测试中的行。