Тестирую сервис в 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<>();
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости