spring-boot-starter-test - starter zawierający wszystkie potrzebne zależności (JUnit, Mockito, AssertJ).@SpringBootTest - uruchamia kontekst Spring podczas testów.@MockBean - tworzy mocki dla zależności.@WebMvcTest - testowanie warstwy webowej (kontrolerów).@DataJpaTest - testowanie warstwy dostępu do danych (repozytoriów).src/
├── main/
│ └── java/com/example/app/
│ ├── controller/
│ │ └── UserController.java
│ ├── service/
│ │ └── UserService.java
│ ├── repository/
│ │ └── UserRepository.java
│ └── model/
│ └── User.java
└── test/
└── java/com/example/app/
├── controller/
│ └── UserControllerTest.java
├── service/
│ └── UserServiceTest.java
├── repository/
│ └── UserRepositoryTest.java
└── integration/
└── UserFlowIntegrationTest.java
Adnotacja @Test oznacza metodę jako testową.
@Test - oznacza metodę jako testową.@BeforeEach - metoda wykonywana przed każdym testem.@AfterEach - metoda wykonywana po każdym teście.@BeforeAll - metoda wykonywana raz przed wszystkimi testami.@AfterAll - metoda wykonywana raz po wszystkich testach.assertEquals(expected, actual) - sprawdza równość wartości.assertTrue(condition) - sprawdza, czy warunek jest prawdziwy.assertFalse(condition) - sprawdza, czy warunek jest fałszywy.assertNotNull(object) - sprawdza, czy obiekt nie jest null.assertThrows(exceptionClass, executable) - sprawdza, czy wykonanie kodu rzuca określony wyjątek.Przykład prostego testu jednostkowego z użyciem JUnit:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; public class CalculatorTest { @Test public void testAddition() { // Arrange - przygotowanie danych testowych Calculator calculator = new Calculator(); // Act - wykonanie testowanej metody int result = calculator.add(2, 3); // Assert - sprawdzenie wyników Assertions.assertEquals(5, result); } }
@ParameterizedTest - oznacza metodę jako parametryzowany test.@ValueSource - pojedyncze wartości (np. liczby, stringi).@CsvSource - dane w formacie CSV (np. „2,3,5”).@MethodSource - dane dostarczane przez metodę zwracającą strumień argumentów.@ParameterizedTest @ValueSource(ints = {1, 2, 3}) public void testIsPositive(int number) { Assertions.assertTrue(number > 0); }
when(mock.method()).thenReturn(value) - definiuje, co ma zwrócić mock dla danego wywołania.
verify(mock).method() - sprawdza, czy metoda została wywołana.
@ExtendWith(MockitoExtension.class) - integracja z JUnit 5.@Mock - tworzy atrapę (mock) dla danej klasy.@InjectMocks - wstrzykuje mocki do testowanej klasy.@Spy - tworzy częściowy mock, który zachowuje się jak prawdziwy obiekt, ale pozwala na stubbing i weryfikację.Test jednostkowy bez uruchamiania kontekstu Spring, z użyciem Mockito do mockowania zależności:
@ExtendWith(MockitoExtension.class) class UserServiceTest { @Mock private UserRepository userRepository; @InjectMocks private UserService userService; @Test void shouldReturnUserWhenExists() { User user = new User(1L, "Jan"); when(userRepository.findById(1L)).thenReturn(Optional.of(user)); User result = userService.getById(1L); assertThat(result.getName()).isEqualTo("Jan"); } }
@WebMvcTest - adnotacja do testowania warstwy webowej (kontrolerów) bez uruchamiania całego kontekstu Spring.MockMvc - narzędzie do symulowania żądań HTTP i sprawdzania odpowiedzi.perform() - wykonuje żądanie HTTP.andExpect() - sprawdza oczekiwane wyniki (status, nagłówki, body).jsonPath() - sprawdza zawartość JSON w odpowiedzi.status().isOk() - sprawdza, czy status odpowiedzi to 200 OK.content().string() - sprawdza zawartość odpowiedzi jako string.jsonPath() - sprawdza zawartość odpowiedzi jako JSON.
Test kontrolera z użyciem @WebMvcTest, który uruchamia tylko warstwę webową:
@WebMvcTest(UserController.class) class UserControllerTest { @Autowired private MockMvc mockMvc; @MockBean private UserService userService; @Test void shouldReturnUser() throws Exception { when(userService.getById(1L)).thenReturn(new User(1L, "Jan")); mockMvc.perform(get("/users/1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("Jan")); } }
@SpringBootTest @AutoConfigureMockMvc class UserControllerTest { @Autowired private MockMvc mockMvc; @Test void shouldReturnUserList() throws Exception { mockMvc.perform(get("/users")) .andExpect(status().isOk()) .andExpect(jsonPath("$[0].name").value("Jan")); } }
@DataJpaTest - adnotacja do testowania warstwy dostępu do danych (repozytoriów) bez uruchamiania całego kontekstu Spring.spring-boot-starter-data-jpa-test - starter zawierający zależności do testowania JPA.'@DataJpaTest class UserRepositoryTest { @Autowired private UserRepository userRepository; @Test void shouldFindUserByEmail() { User user = new User(); user.setName("Jan"); user.setEmail("jan@test.pl"); userRepository.save(user); Optional<User> result = userRepository.findByEmail("jan@test.pl"); assertThat(result).isPresent(); } }
@SpringBootTest class UserFlowIntegrationTest { @Autowired private UserService userService; @Test void shouldCreateUser() { User created = userService.create("Jan", "jan@test.pl"); assertThat(created.getId()).isNotNull(); } }
/** * Serwis odpowiedzialny za zarządzanie użytkownikami. */ public class UserService { /** * Zwraca użytkownika na podstawie identyfikatora. * * @param id identyfikator użytkownika * @return znaleziony użytkownik * @throws UserNotFoundException gdy użytkownik nie istnieje */ public User getById(Long id) { // ... return null; } }
@param - opisuje parametr metody@return - opisuje wartość zwracaną przez metodę@throws - opisuje wyjątki, które metoda może rzucić@author - autor klasy lub metody@version - wersja klasy lub metody@see - odwołanie do innej klasy lub metody@deprecated - oznacza, że element jest przestarzały