Test Driven Development z użyciem JUnit 5. Część 5
Pierwsze nowe funkcje, które wprowadzimy, to nowy typ lotu — premium — i zasady dotyczące tego typu lotu. Istnieje zasada dodawania pasażera: jeśli pasażer jest VIP-em, należy go dodać do lotu premium; w przeciwnym razie wniosek należy odrzucić. Istnieją również zasady dotyczące usuwania pasażera: w razie potrzeby pasażer może zostać usunięty z lotu.
Chcielibyśmy w większym stopniu wykorzystać działający styl TDD i przeprowadzić więcej refaktoryzacji — tym razem do testów. Jest to zgodne z duchem”reguły trzech”, jak stwierdził Don Roberts.
Kiedy robisz coś po raz pierwszy, po prostu to robisz. Za drugim razem, gdy robisz coś podobnego, “skrzywisz się” z powodu duplikacji, ale i tak robisz to samo. Za trzecim razem, gdy robisz coś podobnego, refaktoryzujesz.
A więc trzy “strike’i” i refaktoryzujesz.
Po otrzymaniu wymagania dotyczącego realizacji tego trzeciego typu lotu, pora na pogrupowanie istniejących testów za pomocą adnotacji JUnit 5 @Nested, a następnie zaimplementowanie wymogu lotu premium w podobny sposób. Poniżej znajduje się refaktoryzowana klasa AirportTest przed przejściem do pracy na lot premium.
public class AirportTest {
@DisplayName(“Given there is an economy flight”)
class EconomyFlightTest {
private Flight economyFlight; #1
private Passenger mike; #1
private Passenger james; #1
economyFlight = new EconomyFlight(“1”); #2
mike = new Passenger(“Mike”, false); #2
james = new Passenger(“James”, true); #2
@Nested #3
@DisplayName(“When we have a regular passenger”) #3
class RegularPassenger { #3
“Then you can add and remove him from an economy flight”) #4
public void testEconomyFlightRegularPassenger() {
assertAll( #5
“Verify all conditions for a regular passenger #5
and an economy flight”, #5
() -> assertEquals(“1”, economyFlight.getId()), #5
() -> assertEquals(true, #5
economyFlight.addPassenger(mike)), #5
() -> assertEquals(1, #5
economyFlight.getPassengersList().size()), #5
() -> assertEquals(“Mike”, #5
economyFlight.getPassengersList() #5
.get(0).getName()), #5
() -> assertEquals(true, #5
economyFlight.removePassenger(mike)), #5
() -> assertEquals(0, #5
economyFlight.getPassengersList().size()) #5
@Nested #3
@DisplayName(“When we have a VIP passenger”) #3
class VipPassenger { #3
@DisplayName(“Then you can add him but #4
cannot remove him from an economy flight”) #4
public void testEconomyFlightVipPassenger() {
assertAll(“Verify all conditions for a VIP passenger #5
and an economy flight”, #5
() -> assertEquals(“1”, economyFlight.getId()), #5
() -> assertEquals(true, #5
economyFlight.addPassenger(james)), #5
() -> assertEquals(1, #5
economyFlight.getPassengersList().size()), #5
() -> assertEquals(“James”, #5
economyFlight.getPassengersList().get(0).getName()), #5
() -> assertEquals(false, #5
economyFlight.removePassenger(james)), #5
() -> assertEquals(1, #5
economyFlight.getPassengersList().size()) #5
@DisplayName(“Given there is a business flight”)
class BusinessFlightTest {
private Flight businessFlight; #1
private Passenger mike; #1
private Passenger james; #1
businessFlight = new BusinessFlight(“2”); #2
mike = new Passenger(“Mike”, false); #2
james = new Passenger(“James”, true); #2
@Nested #3
@DisplayName(“When we have a regular passenger”) #3
class RegularPassenger { #3
@DisplayName(“Then you cannot add or remove him #4
from a business flight”) #4
public void testBusinessFlightRegularPassenger() {
assertAll(“Verify all conditions for a regular passenger #5
and a business flight”, #5
() -> assertEquals(false, #5
businessFlight.addPassenger(mike)), #5
() -> assertEquals(0, #5
businessFlight.getPassengersList().size()), #5
() -> assertEquals(false, #5
businessFlight.removePassenger(mike)), #5
() -> assertEquals(0, #5
businessFlight.getPassengersList().size()) #5
@Nested #3
@DisplayName(“When we have a VIP passenger”) #3
class VipPassenger { #3
@DisplayName(“Then you can add him but cannot remove him #4
from a business flight”) #4
public void testBusinessFlightVipPassenger() {
assertAll(“Verify all conditions for a VIP passenger #5
and a business flight”, #5
() -> assertEquals(true, #5
businessFlight.addPassenger(james)), #5
() -> assertEquals(1, #5
businessFlight.getPassengersList().size()), #5
() -> assertEquals(false, #5
businessFlight.removePassenger(james)), #5
() -> assertEquals(1, #5
businessFlight.getPassengersList().size()) #5
W tym listingu:
- W istniejących zagnieżdżonych klasach EconomyFlightTest i BusinessFlightTest grupujemy pola lotu i pasażerów, ponieważ chcielibyśmy dodać jeszcze jeden poziom testowania i ponownie wykorzystać te pola do wszystkich testów dotyczących określonego typu lotu # 1. Inicjalizujemy te pola przed wykonaniem każdego testu # 2.
- Wprowadzamy nowy poziom zagnieżdżenia, aby przetestować różne typy pasażerów. Używamy adnotacji JUnit 5 @DisplayName do oznaczania klas w sposób bardziej wyrazisty i łatwiejszy do naśladowania # 3. Wszystkie te etykiety zaczynają się od słowa kluczowego When.
- Oznaczamy wszystkie istniejące testy za pomocą adnotacji JUnit 5 @DisplayName # 4. Wszystkie te etykiety zaczynają się od słowa kluczowego Then.
- Dokonujemy refaktoryzacji sprawdzania warunków za pomocą metody assertAll JUnit 5 i grupując wszystkie wcześniej istniejące warunki, które można teraz płynnie odczytać # 5.
Originally published at https://www.luxoft-training.pl.