Mam taki test integracyjny, która sprawdza pobieranie sali z miejscami:
@Test
void halls_are_gotten() {
//given
var hall = hallRepository.save(createHall());
var user = addUser();
//when
var responseSpec = webTestClient
.get()
.uri(HALL_ADMIN_ENDPOINT)
.headers(headers -> headers.setBasicAuth(user.getMail(), user.getPassword()))
.exchange();
//then
responseSpec
.expectStatus()
.isOk()
.expectBody()
.jsonPath("$[0].id").isEqualTo(hall.getId())
.jsonPath("$[0].seats").value(hasSize(hall.getSeats().size()));
}
Sam test przechodzi, ale po odpaleniu apki i próbie użycia tego endpointa leci
failed to lazily initialize a collection of role: com.cinema.halls.domain.Hall.seats: could not initialize proxy - no Session]
bo na tej metodzie nie ma @Transactional
:
public List<Hall> getAllHalls() {
return hallRepository.findAll();
}
A sama encja wygląda tak:
@Entity
@Getter
@ToString(exclude = "seats")
public class Hall {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Schema(accessMode = Schema.AccessMode.READ_ONLY)
private Long id;
@ElementCollection
@CollectionTable(name = "seat")
private List<Seat> seats;
protected Hall() {}
public Hall(List<Seat> seats) {
this.seats = seats;
}
}
Test integracyjny powinien wykryć brak tego @Transactional
i nie przejść. Oczywiście nie używam @Transactional
w testach.