Перейти к основному содержимому

JUnit 5 и тестирование Java

Разработчику Архитектору

JUnit 5 и тестирование Java

JUnit 5 (Jupiter) — стандарт unit-тестов в Java. В связке с Mockito и Spring Boot Test покрывают большинство сценариев от чистой логики до HTTP API.

Сборка: Maven и Gradle · Spring · Первая программа на Spring.


JUnit 5 — основы

Зависимость Maven:

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
package com.example.demo;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import static org.junit.jupiter.api.Assertions.*;

class CalculatorTest {

private final Calculator calc = new Calculator();

@Test
@DisplayName("сложение двух чисел")
void adds() {
assertEquals(5, calc.add(2, 3));
}

@ParameterizedTest
@CsvSource({
"0, 0, 0",
"1, 2, 3",
"-1, 1, 0"
})
void addsParameterized(int a, int b, int expected) {
assertEquals(expected, calc.add(a, b));
}

@Test
void throwsOnOverflow() {
assertThrows(ArithmeticException.class, () -> calc.divide(1, 0));
}
}

Запуск:

mvn test
# или
./mvnw test

Mockito

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

@ExtendWith(MockitoExtension.class)
class UserServiceTest {

@Mock
UserRepository repository;

@InjectMocks
UserService service;

@Test
void createsUser() {
when(repository.existsByEmail("a@b.c")).thenReturn(false);
when(repository.save(any())).thenAnswer(inv -> inv.getArgument(0));

var user = service.register("Ann", "a@b.c");

assertEquals("Ann", user.getName());
verify(repository).save(any(User.class));
}
}

Spring Boot Test

В проекте Spring Boot достаточно spring-boot-starter-test (JUnit + Mockito + AssertJ + MockMvc).

@WebMvcTest — контроллер изолированно

@WebMvcTest(HelloController.class)
class HelloControllerTest {

@Autowired
MockMvc mvc;

@Test
void returnsGreeting() throws Exception {
mvc.perform(get("/api/hello").param("name", "Java"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.message").value("Hello, Java"));
}
}

@SpringBootTest — полный контекст

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ApplicationIT {

@Autowired
TestRestTemplate rest;

@Test
void health() {
var response = rest.getForEntity("/actuator/health", String.class);
assertEquals(200, response.getStatusCode().value());
}
}

Структура тестов Maven

src/
main/java/...
test/java/... # зеркало пакетов main

Имена: *Test.java (unit), *IT.java (integration, опционально отдельный профиль).


CI

- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
- run: mvn -B verify

Связанные материалы


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).