Wpis z mikrobloga

Czy taki test sprawdzający czy bilet nie jest zarezerwowany przez więcej niż jednego usera jest ok? Miejsce blokuje pesymistycznie na poziomie bazy.

@test
void ticket_is_booked_only_by_one_user() {
//given
var film = addFilm();
var hall = addHall();
var screening = addScreening(hall, film);
var seat = addSeat(screening, hall.getSeats().getFirst());
var users = addUsers();
var bookTicketDto = new BookTicketDto(screening.getId(), List.of(seat.getId()));

//when
try (var executorService = Executors.newFixedThreadPool(3)) {
executorService.submit(() -> bookTicket(users.getFirst().getMail(), bookTicketDto));
executorService.submit(() -> bookTicket(users.get(1).getMail(), bookTicketDto));
executorService.submit(() -> bookTicket(users.get(2).getMail(), bookTicketDto));
executorService.shutdown();
}

//then
Assertions.assertThat(ticketRepository.getAll()).hasSize(1);
}

#java #naukaprogramowania #programowanie #programista15k
  • 10
Test zakłada, że metoda bookTicket jest idempotentna, tzn. wielokrotne wywołanie tej metody z tymi samymi argumentami nie zmieni stanu systemu po pierwszym wywołaniu. Jeśli tak nie jest, test może nie działać poprawnie.
@Nofenak:

@test
void ticketisbookedonlybyoneuser() {
//given
var film = addFilm();
var hall = addHall();
var screening = addScreening(hall, film);
var seat = addSeat(screening, hall.getSeats().getFirst());
var users = addUsers(100);
var bookTicketDto = new BookTicketDto(screening.getId(), List.of(seat.getId()));
var executorService = Executors.newFixedThreadPool(100);

//when
for (var user : users) {
executorService.submit(() -> bookTicket(user.getMail(), bookTicketDto));
}
executorService.shutdown();
try {
executorService.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}

//then
Assertions.assertThat(ticketRepository.getAll()).hasSize(1);
}
dużo lepiej, ale dalej assert nie sprawdza który user zrobił rezerwację.


@NieBendePrasowac: jak masz to przetestować jak to nie jest określone. Któremuś się uda, ale nie wiadomo któremu