Как настроить JUnit за 1 день

Пошаговое практическое руководство по настройке JUnit 5 в Java-проекте за один рабочий день. Рассматриваются добавление зависимостей, структура каталогов, написание тестов, параметризация, интеграция с Mockito, настройка JaCoCo для покрытия кода и CI/CD.
JUnit 5 — это современный, модульный фреймворк для тестирования на Java, который пришёл на смену JUnit 4. Его настройка в новом или существующем проекте может быть выполнена за один день, если следовать чёткому плану. Цель — не просто добавить библиотеки в classpath, а создать структурированную, поддерживаемую основу для модульного тестирования, которая будет масштабироваться вместе с проектом.

Шаг 1: Инициализация проекта и добавление зависимостей. Если вы используете Maven, откройте `pom.xml` и добавьте зависимости в раздел ``. Минимальный набор для JUnit Jupiter (ядро JUnit 5):
```

 org.junit.jupiter
 junit-jupiter
 5.10.0
 test

```
Эта зависимость транзитивно включает в себя модули `junit-jupiter-api` (для написания тестов), `junit-jupiter-engine` (для запуска) и `junit-jupiter-params` (для параметризованных тестов). Для проектов на Gradle добавьте в `build.gradle` в блок `dependencies`: `testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'`. Убедитесь, что используется правильный плагин: `test { useJUnitPlatform() }`.

Шаг 2: Настройка структуры каталогов. Стандартная структура Maven/Gradle предполагает размещение исходного кода тестов в `src/test/java`. Классы тестов должны находиться в том же пакете, что и тестируемые классы, но в source root для тестов. Создайте эту директорию, если её нет. Ресурсы для тестов (тестовые файлы, конфигурации) помещайте в `src/test/resources`.

Шаг 3: Написание первого теста. Создайте класс в `src/test/java`. Имя класса часто соответствует имени тестируемого класса с суффиксом `Test`. Например, для `Calculator.java` создайте `CalculatorTest.java`. Аннотируйте методы тестов `@Test` из `org.junit.jupiter.api.Test`.
```
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {
 @Test
 void testAddition() {
 Calculator calc = new Calculator();
 assertEquals(5, calc.add(2, 3));
 }
}
```
Запустите тест из IDE (IntelliJ IDEA, Eclipse) или через Maven (`mvn test`) / Gradle (`gradle test`). Если всё настроено верно, тест пройдёт.

Шаг 4: Конфигурация и расширенные возможности. JUnit 5 сильно настраивается через файл `junit-platform.properties`, который можно разместить в `src/test/resources`. В нём можно задать глобальные параметры, например, отключить тесты по тэгам или задать порядок выполнения. Пример содержимого файла:
```
junit.jupiter.testinstance.lifecycle.default = per_class
junit.jupiter.conditions.deactivate = org.junit.*DisabledCondition
```
Для управления жизненным циклом тестов используйте аннотации `@BeforeEach` (выполняется перед каждым тестом), `@AfterEach`, `@BeforeAll` (перед всеми тестами в классе, метод должен быть static), `@AfterAll`. Это заменяет `@Before` и `@After` из JUnit 4.

Шаг 5: Параметризованные тесты. Это мощная функция для запуска одного теста с разными наборами данных. Подключите зависимость `junit-jupiter-params` (уже включена в `junit-jupiter`). Используйте аннотацию `@ParameterizedTest` вместе с источниками данных, например, `@ValueSource`, `@CsvSource`.
```
@ParameterizedTest
@CsvSource({"2, 3, 5", "0, 0, 0", "-1, 5, 4"})
void testAddMultiple(int a, int b, int expected) {
 Calculator calc = new Calculator();
 assertEquals(expected, calc.add(a, b));
}
```

Шаг 6: Теги и фильтрация. Помечайте тесты тэгами с помощью `@Tag("integration")` или `@Tag("fast")`. Затем можно запускать только определённые группы тестов. В Maven: `mvn test -Dgroups="fast"`. В Gradle: `test { useJUnitPlatform { includeTags 'fast' } }`. В `junit-platform.properties` можно исключить тэги глобально.

Шаг 7: Интеграция с Mockito (для мокинг зависимостей). Добавьте зависимость Mockito в `pom.xml` или `build.gradle`:
```

 org.mockito
 mockito-junit-jupiter
 5.7.0
 test

```
Теперь вы можете использовать `@ExtendWith(MockitoExtension.class)` для автоматического создания моков через `@Mock` и инжекта их в тестируемый объект через `@InjectMocks`.

Шаг 8: Настройка покрытия кода (Code Coverage). Хотя это не часть JUnit, это логичный следующий шаг. Добавьте плагин JaCoCo в Maven или Gradle. Для Maven в `pom.xml` в раздел `` -> ``:
```

 org.jacoco
 jacoco-maven-plugin
 0.8.10


 prepare-agent


 report
 test
 report



```
После запуска `mvn test` отчёт появится в `target/site/jacoco/index.html`.

Шаг 9: Интеграция в CI/CD (например, GitHub Actions). Создайте простой workflow-файл, который будет запускать `mvn test` или `gradle test` на каждый push или pull request. Это обеспечит постоянную проверку кодовой базы.

К концу дня у вас будет полностью рабочий тестовый фреймворк с базовыми тестами, поддержкой параметризации, мокинга, тэгов и покрытия кода. Ключевой момент — начать с простого, написать несколько значимых тестов для критического функционала и затем постепенно расширять покрытие, используя все возможности JUnit 5 для создания надёжных и поддерживаемых тестов.
266 3

Комментарии (15)

avatar
suk5o2 31.03.2026
А есть ли аналогичное руководство для Kotlin? Хотелось бы увидеть особенности настройки JUnit 5 для него.
avatar
aw2ixh 31.03.2026
Хотелось бы больше примеров кода для шага настройки зависимостей, особенно с учётом разных версий библиотек.
avatar
udwg9bhw 31.03.2026
Статья хорошая, но 'за 1 день' — это маркетинг. Чтобы разобраться во всех нюансах, нужна неделя минимум.
avatar
unkjq6m64gg 31.03.2026
Приятно видеть фокус на структуре проекта. Многие забывают, что тесты — такая же часть кода, требующая организации.
avatar
1ets5hdl 02.04.2026
Спасибо за акцент на 'поддерживаемой основе'. Часто просто добавляют зависимости, не думая об архитектуре тестов.
avatar
1gqj10l2isi 02.04.2026
Следовал шагам — всё заработало. Особенно помог раздел про JUnit Jupiter. Наконец-то разобрался в различиях модулей.
avatar
6s0g9nq0 02.04.2026
Полезный материал для джунов. Главное — начать с малого, как советуют, а не пытаться покрыть всё сразу.
avatar
mtiyad8 02.04.2026
Автор обещает настройку за день, но у новичка на интеграцию с Spring Boot может уйти больше времени. Не всё так линейно.
avatar
gtmy27 03.04.2026
Статья неплохая, но поверхностная. Для реального внедрения нужно глубже изучать документацию и best practices.
avatar
bs3k76p2 03.04.2026
Автор прав насчёт масштабируемости. Заложенная с первого дня правильная основа сэкономит месяцы работы в будущем.
Вы просмотрели все комментарии