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