模拟服务抛出nullPointerException

时间:2018-07-30 14:59:11

标签: java mocking mockito junit4

我对Java很陌生,尝试为我的代码编写一些单元测试。但卡在其中之一上。

这是我要测试的方法:

public Reservation findSpecificReservation(Long id) throws NullPointerException{
    Reservation reservation = null;
    Optional<Reservation> byId = iReservationRepository.findById(id);
    if(byId.isPresent()){
        reservation = byId.get();
    }
    return reservation;
}

这些是模拟变量和设置变量:

private IReservationService iReservationService;

@Mock
private IReservationRepository repository;


@Before
public void setUp() {
    initMocks(this);
    iReservationService = new ReservationServices(repository);
}

测试如下:

    @Test
public void shouldFindReservation() {
    Long id = 1L;

    Reservation expected = getDefaultReservation();

    when(iReservationService.findSpecificReservation(id)).thenReturn(getDefaultReservation());

    Reservation actual = iReservationService.findSpecificReservation(id);

    Assert.assertThat(expected, is(actual));
}

我的测试在thenReturn,ireservationService.findSpecificReservatin(id)抛出该异常的通道中抛出空指针异常。

有人可以让我知道我做错了什么吗?

我是编程的开始者,如果您能对我轻描淡写,我将非常高兴,谢谢!

编辑添加整个类:

package com.hotelReservation.hotelReservation.services;

import com.hotelReservation.hotelReservation.domain.ReservationStatusResponse;
import com.hotelReservation.hotelReservation.entity.Reservation;
import com.hotelReservation.hotelReservation.entity.User;
import com.hotelReservation.hotelReservation.repository.IReservationRepository;
import com.hotelReservation.hotelReservation.repository.IRoomRepository;
import com.hotelReservation.hotelReservation.repository.IUserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class ReservationServices implements IReservationService {

private IReservationRepository iReservationRepository;
private IRoomRepository iRoomRepository;
private IUserRepository iUserRepository;

@Autowired
public ReservationServices(IReservationRepository iReservationRepository) {
    this.iReservationRepository = iReservationRepository;
    this.iRoomRepository = iRoomRepository;
    this.iUserRepository = iUserRepository;
}

@Override
public ReservationStatusResponse addReservation(LocalDate begin, LocalDate end, Long roomId, Long userId, String breakfast, String diner, String rentCar, int adultsForReservation) {
    PriceCounter priceCounter = new PriceCounter();
    int days = 0;
    if (end.isAfter(begin)) {
        days = begin.until(end).getDays();
    }
    int price = priceCounter.calculatePrice(breakfast, diner, rentCar, days, adultsForReservation);
    Reservation newReservation = Reservation.builder()
            .begin(begin)
            .end(end)
            .roomForReservation(iRoomRepository.findById(roomId).get())
            .user(iUserRepository.findById(userId).get())
            .breakfast(breakfast)
            .dinner(diner)
            .rentCar(rentCar)
            .adultsForReservation(adultsForReservation)
            .price(price)
            .build();

    ReservationStatusResponse reservationStatusResponse = checkIsReservationDatesAreNotTaken(newReservation.getRoomForReservation()
            .getId(), newReservation.getBegin(), newReservation.getEnd());
    if (reservationStatusResponse.isPossible()) {
        iReservationRepository.save(newReservation);
    }
    return reservationStatusResponse;
}

@Override
public void cancelReservation(Long id) {
    iReservationRepository.deleteById(id);
}

public List<Reservation> findAllReservationOfSpecificUser(Long id) {
    List<Reservation> allByUserId = iReservationRepository.findAllByUserId(id);
    return new ArrayList<>(allByUserId);
}

public Reservation findSpecificReservation(Long id) throws NullPointerException {
    Reservation reservation = null;
    Optional<Reservation> byId = iReservationRepository.findById(id);
    if (byId.isPresent()) {
        reservation = byId.get();
    }
    return reservation;
}

public List<Reservation> findAllReservationsOnRoom(Long roomId) {
    return iReservationRepository.findReservationsByRoom(roomId);
}

@Override
public ReservationStatusResponse checkIsReservationDatesAreNotTaken(Long roomId, LocalDate begin, LocalDate end) {
    ReservationStatusResponse reservationStatusResponse = new ReservationStatusResponse();
    if (begin.isAfter(end) || begin.isBefore(LocalDate.now())) {
        reservationStatusResponse.setPossible(false);
        reservationStatusResponse.setReason("Begin date is after end date or before today !");
        return reservationStatusResponse;
    }
    int newReservationPeriod = begin.until(end).getDays();
    List<LocalDate> newReservationDates = new ArrayList<>();
    List<LocalDate> takenReservationDates = new ArrayList<>();
    for (int i = 0; i <= newReservationPeriod; i++) {
        newReservationDates.add(begin.plusDays(i));
    }
    List<Reservation> allReservationsOnRoom = findAllReservationsOnRoom(roomId);
    for (Reservation r :
            allReservationsOnRoom) {
        int existingReservationPeriod = r.getBegin().until(r.getEnd()).getDays();
        for (int i = 0; i <= existingReservationPeriod; i++) {
            takenReservationDates.add(r.getBegin().plusDays(i));
        }
        for (LocalDate l :
                takenReservationDates) {
            for (LocalDate lo :
                    newReservationDates) {
                if (l.isEqual(lo)) {
                    reservationStatusResponse.setReason("Date is taken");
                    reservationStatusResponse.setPossible(false);
                    return reservationStatusResponse;
                }
            }
        }
    }
    reservationStatusResponse.setPossible(true);
    reservationStatusResponse.setReason("Possible");
    return reservationStatusResponse;
}


@Override
public List<Reservation> findAll() {
    return iReservationRepository.findAll();
}


}

测试课程:

package com.hotelReservation.hotelReservation.services;

import com.hotelReservation.hotelReservation.domain.ReservationStatusResponse;
import com.hotelReservation.hotelReservation.entity.Reservation;
import com.hotelReservation.hotelReservation.entity.Room;
import com.hotelReservation.hotelReservation.repository.IReservationRepository;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;

import static org.hamcrest.CoreMatchers.is;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;

public class ReservationServicesTest {

private IReservationService iReservationService;

@Mock
private IReservationRepository repository;


@Before
public void setUp() {
    initMocks(this);
    iReservationService = new ReservationServices(repository);
}

@Test
public void ShouldDeleteReservationById() {

    Long id = 12L;

    Mockito.doNothing().when(repository).deleteById(id);

    iReservationService.cancelReservation(id);

    Mockito.verify(repository, Mockito.times(1)).deleteById(id);
}

@Test
public void shouldFindReservation() {
    Long id = 1L;

    Reservation expected = getDefaultReservation();

    when(iReservationService.findSpecificReservation(id)).thenReturn(getDefaultReservation());

    Reservation actual = iReservationService.findSpecificReservation(id);

    Assert.assertThat(expected, is(actual));
}

@Test(expected = NullPointerException.class)
public void shouldThrowNullPointerExceptionOnFindingReservationWithDoesntExist() {
    Long id = 1L;

  iReservationService.findSpecificReservation(id);

}

@Test
public void shouldReturnListOfReservations() {
    Long id = 1L;
    List<Reservation> reservationListFromDb = getReservationDatesListFromDb();

    when(iReservationService.findAllReservationsOnRoom(id)).thenReturn(reservationListFromDb);

    List<Reservation> actual = iReservationService.findAllReservationsOnRoom(id);

    Assert.assertArrayEquals(reservationListFromDb.toArray(), actual.toArray());
}


private List<Reservation> getReservationDatesListFromDb() {
    Reservation first = Reservation.builder()
            .begin(LocalDate.of(2018, 05, 01))
            .end(LocalDate.of(2018, 05, 03))
            .build();
    Reservation second = Reservation.builder()
            .begin(LocalDate.of(2017, 05, 01))
            .end(LocalDate.of(2017, 05, 03))
            .build();
    return Arrays.asList(first, second);
}


private Reservation getDefaultReservation() {
    return Reservation.builder()
            .begin(LocalDate.of(2018, 7, 23))
            .end(LocalDate.of(2018, 7, 29))
            .reservationId(1234L)
            .roomForReservation(getDefaultRoom())
            .rentCar("NO")
            .breakfast("NO")
            .dinner("NO")
            .adultsForReservation(2)
            .build();
}

public Room getDefaultRoom() {
    return Room.builder()
            .howManyPeople(2)
            .id(12L)
            .roomClass("Hobbit")
            .build();
}
}

1 个答案:

答案 0 :(得分:1)

您忘记了WHERE foo == '' OR foo is null. 上的@InjectMocks

iReservationService

,无需执行

@InjectMocks
private IReservationService iReservationService;

使用您的iReservationService = new ReservationServices(repository); 方法。

并且您应该嘲笑setup()的调用,而不是repository本身的调用。