«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.