Samouczek JUnit5

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