Wstęp
JUnit 5 to powszechnie stosowany framework testowy dla języka Java, który pozwala programistom na tworzenie, wykonywanie i utrzymywanie testów w ramach ich projektów. Stanowi on ewolucję wcześniejszej wersji JUnit 4, wprowadzając szereg nowych opcji i ulepszeń, które upraszczają i optymalizują proces testowania.
Jego architektura opiera się na elastyczności, umożliwiając personalizację poprzez implementację dodatkowych rozszerzeń. Dodano także nowy zbiór adnotacji testowych, takich jak @DisplayName i @RepeatedTest, które zwiększają przejrzystość i adaptacyjność testów.
Ten przewodnik przeprowadzi Cię przez wszystkie aspekty JUnit 5, od początkowej konfiguracji po zaawansowane techniki testowania. Dowiesz się, jak tworzyć testy jednostkowe, integracyjne i funkcjonalne, a także jak korzystać z rozszerzeń i dostosowywać framework do indywidualnych potrzeb.
Konfiguracja JUnit 5
Aby rozpocząć pracę z JUnit 5, niezbędne jest dodanie poniższej zależności do pliku pom.xml:
org.junit.jupiter junit-jupiter 5.9.0 test
Możliwe jest również dodanie zależności dla innych komponentów JUnit 5, na przykład junit-jupiter-params (dla testów parametrycznych) lub junit-jupiter-engine (dla niestandardowego uruchamiania testów).
Podstawowe Testy Jednostkowe
Testy jednostkowe koncentrują się na testowaniu pojedynczych metod lub klas niezależnie. W JUnit 5 do oznaczania metod testowych służy adnotacja @Test. Na przykład:
import org.junit.jupiter.api.Test;
public class CalculatorTest {
@Test
void add() {
Calculator calculator = new Calculator();
int result = calculator.add(2, 3);
assertEquals(5, result);
}
}
W powyższym kodzie testowana jest metoda add klasy Calculator. Adnotacja @Test określa metodę jako testową, a assertEquals() weryfikuje, czy wynik dodawania jest równy 5.
Testy Integracyjne
Testy integracyjne weryfikują interakcje między poszczególnymi składnikami systemu. W JUnit 5 wykorzystuje się adnotację @ExtendWith w połączeniu z klasą rozszerzenia, która oferuje dodatkowe funkcje. Przykład:
import org.junit.jupiter.api.ExtendWith;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
public class ServiceTest {
@Mock
private Repository repository;
@InjectMocks
private Service service;
@Test
void save() {
service.save("test");
verify(repository).save("test");
}
}
W tym przypadku test rozszerzono o klasę MockitoExtension, która umożliwia korzystanie z biblioteki Mockito do tworzenia obiektów zastępczych. Test sprawdza, czy metoda save klasy Service wywołuje metodę save repozytorium.
Testy Funkcjonalne
Testy funkcjonalne weryfikują całe funkcje lub scenariusze w aplikacji. W JUnit 5 nie ma specjalnej adnotacji dla testów funkcjonalnych, jednak można użyć istniejących, takich jak @Test i @ExtendWith. Przykład:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
@SpringBootTest
@AutoConfigureMockMvc
public class ControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void index() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/"))
.andExpect(MockMvcResultMatchers.status().isOk());
}
}
W tym przykładzie wykorzystano zależności Spring Boot do utworzenia kontekstu aplikacji i automatycznej konfiguracji obiektu MockMvc do testowania kontrolerów webowych. Test weryfikuje, czy żądanie GET na adres URL / zwraca kod odpowiedzi HTTP 200.
Rozszerzenia JUnit 5
JUnit 5 jest rozszerzalny, co oznacza, że można dodawać własne rozszerzenia, aby dostosować jego działanie. Rozszerzenia tworzy się przez implementację interfejsu Extension. Na przykład:
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestInstancePostProcessor;
public class CustomExtension implements TestInstancePostProcessor {
@Override
public void postProcessTestInstance(Object testInstance, ExtensionContext context) {
// dostosowanie instancji testu
}
}
To rozszerzenie można zarejestrować w pliku junit-platform.properties, poprzez dodanie poniższego wpisu:
junit.jupiter.extensions.post-processors = CustomExtension
Porównanie JUnit 4 i JUnit 5
JUnit 5 wprowadza wiele ulepszeń w porównaniu z JUnit 4, między innymi:
| * Elastyczność: | Możliwość dodawania niestandardowych rozszerzeń. |
| * Uproszczone adnotacje: | Nowe adnotacje, jak @DisplayName i @RepeatedTest, zwiększające czytelność i adaptacyjność. |
| * Wyrażenia lambda: | Obsługa wyrażeń lambda w adnotacjach testowych. |
| * Adnotowanie metod pomocniczych: | Możliwość adnotacji metod pomocniczych. |
| * Testowanie parametryczne: | Rozszerzone wsparcie dla testów parametrycznych. |
Przykładowy Projekt
Aby zobaczyć JUnit 5 w praktyce, sprawdź przykładowy projekt na Github.
Podsumowanie
JUnit 5 jest efektywnym i elastycznym frameworkiem testowym, który umożliwia programistom tworzenie, uruchamianie i utrzymywanie testów w projektach Java. Dzięki elastyczności, prostym adnotacjom i wsparciu dla wyrażeń lambda stanowi wygodne i efektywne narzędzie do testowania różnorodnych aplikacji.
Wykorzystując techniki przedstawione w tym przewodniku, można skutecznie testować kod, podnosząc jego niezawodność i utrzymując wysoką jakość projektów w Javie.
Najczęściej Zadawane Pytania
1. Czym różni się JUnit 5 od JUnit 4? JUnit 5 oferuje rozszerzalność, uproszczone adnotacje, obsługę wyrażeń lambda, testowanie parametryczne oraz inne udoskonalenia.
2. Jak skonfigurować JUnit 5 w projekcie? Dodaj zależność junit-jupiter do pliku pom.xml.
3. Jak utworzyć test jednostkowy w JUnit 5? Użyj adnotacji @Test, aby oznaczyć metody testowe.
4. Czym jest test integracyjny w JUnit 5? To test, który sprawdza interakcje między różnymi elementami systemu.
5. Jak testować kontrolery webowe z JUnit 5? Wykorzystaj zależności Spring Boot do stworzenia kontekstu aplikacji i obiektu MockMvc.
6. Czym są rozszerzenia JUnit 5? Są to klasy implementujące interfejs Extension, pozwalające na modyfikację działania frameworka.
7. Jak porównać JUnit 4 i JUnit 5? JUnit 5 oferuje rozszerzalność, prostsze adnotacje, wsparcie dla wyrażeń lambda i inne ulepszenia w porównaniu z JUnit 4.
8. Gdzie znaleźć więcej informacji o JUnit 5? Zajrzyj do oficjalnej dokumentacji oraz do repozytorium na Githubie.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.