1. Обзор
В этом коротком руководстве мы собираемся реализовать нестатические методы с аннотациями @BeforeAll
и @AfterAll,
доступными в Junit5
.
2. @BeforeAll
и @AfterAll
в нестатических методах
Во время модульного тестирования мы можем иногда захотеть использовать @BeforeAll
и @AfterAll
в нестатических методах установки и демонтажа — например, в тестовом классе @ Nested
или в качестве методов интерфейса по умолчанию.
Создадим тестовый класс с методами @BeforeAll
и @AfterAll
как нестатическими:
public class BeforeAndAfterAnnotationsUnitTest {
String input;
Long result;
@BeforeAll
public void setup() {
input = "77";
}
@AfterAll
public void teardown() {
input = null;
result = null;
}
@Test
public void whenConvertStringToLong_thenResultShouldBeLong() {
result = Long.valueOf(input);
Assertions.assertEquals(77l, result);
}
}
Если мы запустим приведенный выше код, он выдаст исключение:
org.junit.platform.commons.JUnitException: ...
Давайте теперь посмотрим, как мы можем избежать этой ситуации.
3. Аннотация @TestInstance
Мы будем использовать аннотацию @TestInstance
для настройки жизненного цикла теста. Если мы не объявим его в нашем тестовом классе, режим жизненного цикла по умолчанию будет PER_METHOD
.
Итак, чтобы наш тестовый класс не вызывал JUnitException,
нам нужно аннотировать его с помощью @TestInstance(TestInstance.
Lifecycle.PER_CLASS) .
Давайте переделаем наш тестовый класс и добавим @TestInstance(TestInstance.
Lifecycle.PER_CLASS):
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class BeforeAndAfterAnnotationsUnitTest {
String input;
Long result;
@BeforeAll
public void setup() {
input = "77";
}
@AfterAll
public void teardown() {
input = null;
result = null;
}
@Test
public void whenConvertStringToLong_thenResultShouldBeLong() {
result = Long.valueOf(input);
Assertions.assertEquals(77l, result);
}
}
В этом случае наш тест проходит успешно.
4. Вывод
В этой короткой статье мы узнали, как использовать @BeforeAll
и @AfterAll
в нестатических методах. Во-первых, мы начали с простого нестатического примера, чтобы показать, что произойдет, если мы не включим аннотацию @TestInstance
. Затем мы аннотировали наш тест @TestInstance(TestInstance.Lifecycle.PER_CLASS)
, чтобы предотвратить создание JUnitException
.
Как всегда, реализация всех этих примеров закончена на GitHub .