Тест сервиса в Spring Boot + Spring Data

270
10 февраля 2019, 02:50

Тестирую сервис в Spring Boot + Spring Data, но в тестах whenFindFlightsByFlightDTO_thenReturnFlights(), whenFindFlightsForAirportByDate_thenFindFlightsForAirportByDate() репозиторий не находит сохраненный через TestEnityManager сущность, возвращая пустой список. При этом в тесте whenFindFlightByNumberAndDateAndTime_thenReturnFlight все находит и сами сервис и репозиторий вне теста работают и все находят.

Тест

 @RunWith(SpringRunner.class)
    @DataJpaTest
    @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
    @ComponentScan("com.foxminded.airline.domain.service.impl")
    //@WebAppConfiguration
    public class FlightServiceTest {
        @Autowired
        private TestEntityManager entityManager;
        @Autowired
        private FlightService flightService;
        @Autowired
        private FlightRepository flightRepository;
        private Flight flight;
        private LocalDate date;
        private LocalTime time;
        private Plane plane;
        private Airport departureAirport;
        private Airport arrivalAirport;
        private Airline airline;
        private String number;
        private FlightDTO flightDTO;
        @Before
        public void setUp() {
            airline = new Airline();
            airline.setName("Qatar Airways");
            arrivalAirport = new Airport();
            arrivalAirport.setName("London");
            departureAirport = new Airport();
            departureAirport.setName("Berlin");
            plane = new Plane();
            plane.setName("Boeing 737");
            time = LocalTime.of(7, 45);
            date = LocalDate.of(2018, 10, 15);
            number = "7845";
            flight = new Flight();
            flight.setAirline(airline);
            flight.setArrivalAirport(arrivalAirport);
            flight.setDepartureAirport(departureAirport);
            flight.setDate(date);
            flight.setTime(time);
            flight.setNumber(number);
            flightDTO = new FlightDTO();
            flightDTO.setNumber(number);
            flightDTO.setArrivalAirport(arrivalAirport.getName());
            flightDTO.setDepartureAirport(departureAirport.getName());
            flightDTO.setDateString("2018-10-15");
            entityManager.persist(airline);
            entityManager.persist(departureAirport);
            entityManager.persist(arrivalAirport);
            entityManager.persist(plane);
            entityManager.persist(flight);
        }
        @After
        public void tearDown() {
            entityManager.remove(flight);
            entityManager.remove(airline);
            entityManager.remove(departureAirport);
            entityManager.remove(arrivalAirport);
            entityManager.remove(plane);
        }
        @Test
        public void whenFindFlightByNumberAndDateAndTime_thenReturnFlight() {
            Flight expectedFlight = flight;
            Flight actualFlight = flightService.findFlightByNumberAndDateAndTime(number, date, time);
            assertEquals(expectedFlight, actualFlight);
        }
        @Test
        public void whenFindFlightsByFlightDTO_thenReturnFlights() {
            List<Flight> actualFlights = flightService.findFlightsByFlightDTO(flightDTO);
            List<Flight> flights = (List)flightRepository.findAll();
            assertThat(actualFlights, hasItems(flight));
        }
        @Test
        public void whenFindFlightsForAirportByDate_thenFindFlightsForAirportByDate() {   
            List<Flight> actualFlights = flightService.findFlightsForAirportByDate(flightDTO);
            assertThat(actualFlights, hasItems(flight));
        }
}

Сервис

@Service
public class FlightServiceImpl implements FlightService {
    @Autowired
    AirportRepository airportRepository;
    @Autowired
    FlightRepository flightRepository;
    @Override
    public Flight findFlightByNumberAndDateAndTime(String number, LocalDate date, LocalTime time) {
        return flightRepository.findByNumberAndDateAndTime(number, date, time).get();
    }
    @Override
    public List<Flight> findFlightsByFlightDTO(FlightDTO flightDTO) {
        LocalDate dateFlight = LocalDate.parse(flightDTO.getDateString());
        Airport departureAirport = airportRepository.findByNameIgnoreCase(flightDTO.getDepartureAirport()).get();
        Airport arrivalAirport = airportRepository.findByNameIgnoreCase(flightDTO.getArrivalAirport()).get();
        List<Flight> flights =new ArrayList<>();
        flights.addAll(flightRepository.findByDepartureAirportAndArrivalAirportAndDate(departureAirport, arrivalAirport, dateFlight));
        return flightRepository.findByDepartureAirportAndArrivalAirportAndDate(departureAirport, arrivalAirport, dateFlight);
    }
    @Override
    public List<Flight> findFlightsForAirportByDate(FlightDTO flightDTO) {
        LocalDate dateFlight = LocalDate.parse(flightDTO.getDateString());
        Airport airport = airportRepository.findByNameIgnoreCase(flightDTO.getDepartureAirport()).get();
        List<Flight> flights = flightRepository.findByDepartureAirportAndDate(airport, dateFlight);
        flights.addAll(flightRepository.findByArrivalAirportAndDate(airport, dateFlight));
        return flights;
    }
}

Репозиторий

@Repository
public interface FlightRepository extends CrudRepository<Flight, Integer> {
    List<Flight> findByDepartureAirportAndArrivalAirportAndDate(Airport departureAirport, Airport arrivalAirport, LocalDate date);
    Optional<Flight> findByNumberAndDateAndTime(String number, LocalDate date, LocalTime time);
    List<Flight> findByDepartureAirportAndDate(Airport departureAirport, LocalDate date);
    List<Flight> findByArrivalAirportAndDate(Airport arrivalAirport, LocalDate date);
}

Сущность

@Entity
@Table(name = "flight")
public class Flight {
    @Id
    @SequenceGenerator(name = "flight_id_seq", sequenceName = "flight_flight_id_seq", allocationSize = 1)
    @GeneratedValue(generator = "flight_id_seq", strategy = GenerationType.SEQUENCE)
    @Column(name = "flightId", unique = true)
    private int id;
    private String number;
    private LocalDate date;
    private LocalTime time;
    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
    @JoinColumn(name = "planeId")
    private Plane plane;
    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
    @JoinColumn(name = "departure_airport_id", insertable = false, updatable = false)
    private Airport departureAirport;
    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
    @JoinColumn(name = "arrival_airport_id", insertable = false, updatable = false)
    private Airport arrivalAirport;
    @OneToMany(mappedBy = "flight", fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
    private List<Ticket> tickets = new ArrayList<>();
    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
    @JoinColumn(name = "airlineId")
    private Airline airline;
    @OneToMany(mappedBy = "flight", cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE})
    private List<FlightPrice> flightPrices = new ArrayList<>();
}
READ ALSO
ошибка при использовании -D для спрингового приложения

ошибка при использовании -D для спрингового приложения

Приложение на tomcat+spring Запускаю из идеи на локальном томкате и, в шаге с мавен, выполняю команду

242
Android или Java. Уменьшить размер изображения без (с минимальной) потери качества

Android или Java. Уменьшить размер изображения без (с минимальной) потери качества

Делаю фото в разрешении 1440x1080Использую следующий код, что бы развернуть если необходимо изображение, обрезать квадрат, и уменьшить его до 1000x1000

248
Как сохранить действие кнопки Button при смене ореинтации (а точнее сделать так что бы метод setAnswerShownResult) не &ldquo;сбивался&rdquo;

Как сохранить действие кнопки Button при смене ореинтации (а точнее сделать так что бы метод setAnswerShownResult) не “сбивался”

При повороте экрана активность останавливается и запускается снова, поэтому восстаналивается положение как после выполнения onCreate()Чтобы...

216
JavaFX некорректный вывод X-Bee пакета в файл

JavaFX некорректный вывод X-Bee пакета в файл

Имеется строковая переменная

239