1. Обзор
В этой статье мы кратко рассмотрим аннотацию JUnit @Test
. Эта аннотация предоставляет мощный инструмент для выполнения модульного и регрессионного тестирования.
2. Конфигурация Maven
Чтобы использовать последнюю версию JUnit 5 , нам нужно добавить следующую зависимость Maven:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
Мы используем тестовую
область, потому что не хотим, чтобы Maven включал эту зависимость в нашу окончательную сборку.
Поскольку подключаемый модуль surefire не полностью поддерживает JUnit 5, нам также потребуется добавить провайдера , который сообщает Maven, где найти наши тесты:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
</plugin>
В нашей конфигурации мы будем использовать surefire 2.19.1, поскольку на момент написания статьи версия 2.20.x несовместима с junit-platform-surefire-provider
.
3. Тестируемый метод
Прежде всего, давайте создадим простой метод, который мы будем использовать в наших тестовых сценариях, чтобы продемонстрировать возможности аннотации @Test
:
public boolean isNumberEven(Integer number) {
return number % 2 == 0;
}
Этот метод должен возвращать true
, если переданный аргумент является четным числом, и false
в противном случае. Теперь давайте проверим, работает ли он так, как должен.
4. Тестирование метода
Для нашего примера мы хотим специально проверить два сценария:
- при задании четного числа метод должен возвращать
true
- при задании нечетного числа метод должен возвращать
false
Это означает, что код реализации вызовет наш метод isNumberEven
с другими параметрами и проверит, что результат соответствует ожидаемому.
Чтобы тесты распознавались как таковые, добавим аннотацию @Test
. У нас может быть столько их, сколько мы хотим в классе, но хорошей практикой является объединение только связанных. Заметьте также, что тест не должен быть закрытым и
не может возвращать значение, иначе он будет просто проигнорирован.
Учитывая эти соображения, давайте напишем наши методы тестирования:
@Test
void givenEvenNumber_whenCheckingIsNumberEven_thenTrue() {
boolean result = bean.isNumberEven(8);
Assertions.assertTrue(result);
}
@Test
void givenOddNumber_whenCheckingIsNumberEven_thenFalse() {
boolean result = bean.isNumberEven(3);
Assertions.assertFalse(result);
}
Если мы сейчас запустим сборку Maven, подключаемый модуль surefire пройдет через все аннотированные методы в классах, размещенных в src/test/java
, и выполнит их , что приведет к сбою сборки, если произойдет какой-либо сбой теста .
Если вы работаете с JUnit 4, имейте в виду, что в этой версии аннотация не принимает никаких параметров. Чтобы проверить тайм-аут или выброшенное исключение, вместо этого мы будем использовать утверждения:
@Test
void givenLowerThanTenNumber_whenCheckingIsNumberEven_thenResultUnderTenMillis() {
Assertions.assertTimeout(Duration.ofMillis(10), () -> bean.isNumberEven(3));
}
@Test
void givenNull_whenCheckingIsNumberEven_thenNullPointerException() {
Assertions.assertThrows(NullPointerException.class, () -> bean.isNumberEven(null));
}
5. Вывод
В этом кратком руководстве мы показали, как реализовать и запустить простой тест JUnit с аннотацией @Test
.
Подробнее о структуре JUnit можно узнать в этом посте , который содержит общее введение.
Весь код, использованный в примерах, доступен в проекте GitHub .