I test the service in Spring Boot + Spring Data, but in the whenFindFlightsByFlightDTO_thenReturnFlights () tests, whenFindFlightsForAirportByDate_thenFindFlightsForAirportByDate () does not find the entity saved via TestEnityManager, returning an empty list. At the same time, in the whenFindFlightByNumberAndDateAndTime_thenReturnFlight test, everything finds and the service itself and the repository outside the test work and everyone finds.

Test

@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

 @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

 @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); } 

Essence

 @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<>(); } 
  • After entityManager # persist do entityManager # flush - not a Programmer
  • Tried, does not help - Alexander Trushin
  • This is an attempt to emulate a real work in the form of a test. If you write like this, then write as it actually works, if this is not possible or not necessary, then use Mockito - keekkenen

0