Зачем нужны тесты и что такое JUnit
Автоматический тест — небольшой метод, который вызывает ваш код с известными данными и проверяет результат. Вы пишете его один раз, а потом запускаете сотни таких проверок за пару секунд после каждого изменения. Если правка в одном месте сломала что-то в другом, об этом сразу скажет тест, а не пользователь через неделю.
В учебнике вы уже написали первый тест на JUnit. Этот курс идёт дальше: как организовать тесты, читать отчёты о падениях, проверять ошибки и граничные случаи и как заменить базу данных или почтовый сервер заглушками.
Три библиотеки
| Библиотека | Что делает |
|---|---|
| JUnit | Находит и запускает тесты, даёт @Test и проверки assertEquals, assertThrows и другие |
| Mockito | Создаёт моки — поддельные объекты, которые подменяют базу, почтовый сервер или другой сервис |
| AssertJ | Необязательная: читаемые цепочки проверок вида assertThat(list).hasSize(2) |
JUnit — основа, две другие библиотеки подключаются к нему.
Версии
Курс использует JUnit 6.1 (6.1.3), Mockito 5.24 и AssertJ 3.27, Java 25 и Maven. По сравнению с JUnit 5 для автора тестов в шестой версии изменилось немного:
- минимальная версия Java — 17;
- у всех артефактов JUnit теперь один номер версии (раньше платформа была 1.x, а Jupiter — 5.x);
- данные CSV для параметризованных тестов читает новый парсер;
- удалены давно устаревшие API.
API тестов — org.junit.jupiter.api.Test, Assertions, @BeforeEach — тот же, что в JUnit 5. Имя Jupiter, которое встречается в пакетах, — название современной модели написания тестов в JUnit.
Что будем тестировать
В примерах два небольших набора обычных Java-классов, без веб-фреймворка:
PriceCalculatorиз магазина: сумма заказа и скидка, суммы вBigDecimal;- блог: запись
Post, интерфейсPostRepository, сервисPostService, который создаёт и публикует посты и отправляет автору уведомление черезNotifier.
Классы создаются в следующем уроке, тесты к ним растут от урока к уроку.
Виды тестов
| Вид | Что проверяет | Скорость |
|---|---|---|
| Модульный (unit) | Один класс, всё остальное подменено | Миллисекунды |
| Интеграционный | Несколько частей вместе: сервис и настоящая база | Секунды |
| Сквозной (end-to-end) | Всё приложение через его интерфейс | Минуты |
Курс посвящён модульным тестам: их должно быть больше всего, и именно для них сделаны JUnit и Mockito.
Частая ошибка
Старые статьи используют JUnit 4: import org.junit.Test и org.junit.Assert.assertEquals. В проекте на JUnit 6 такой тест не компилируется:
[ERROR] /.../src/test/java/com/example/shop/OldStyleTest.java:[3,17] cannot find symbol
symbol: class Test
location: package org.junitИспользуйте импорты из org.junit.jupiter.api — org.junit.jupiter.api.Test и org.junit.jupiter.api.Assertions. Тестовым классам и методам больше не нужен модификатор public.