Как избавиться от правила TemporaryFolder в Junit5

Я переношу модульные тесты с Junit4 на Junit5. В тесте я использую TemporaryFolder правило от Junit4. API. Чтобы тест работал, я добавил аннотацию @EnableRuleMigrationSupport:

@EnableRuleMigrationSupport
public final class SomeTest {

    @Rule
    public final TemporaryFolder tmp = new TemporaryFolder();

   // tests ...
}

Насколько я понимаю, в Junit5 мне нужно использовать расширения вместо правил , но я не могу найти замену TemporaryFolder в расширениях Junit5. Он существует? Как правильно заменить правило TemporaryFolder расширением?


person Kirill    schedule 15.06.2019    source источник


Ответы (1)


Вы можете использовать @TempDir (JUnit 5.4+), описанная в §2.20.1 Руководства пользователя JUnit 5. Из руководства пользователя (выделено моим):

Встроенное расширение TempDirectory используется для создания и очистки временного каталога для отдельного теста или всех тестов в тестовом классе. Он зарегистрирован по умолчанию. Чтобы использовать его, аннотируйте нечастное поле типа java.nio.file.Path или java.io.File с помощью @TempDir или добавьте параметр типа java.nio.file.Path или java.io.File с аннотацией @TempDir к методу жизненного цикла или методу тестирования.

Примечание. Это расширение было добавлено в версии 5.4 и в настоящее время (по состоянию на 5.7.2) является экспериментальным.

Пример использования поля экземпляра:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path; // or use java.io.File

class SomeTests {

    @TempDir
    Path directory; // must be non-private

}

Пример использования параметра тестового метода:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path; // or use java.io.File

class SomeTests {

    @Test
    void testFoo(@TempDir Path directory) {
        // do test...
    }

}

Примечание. Параметры конструктора не поддерживаются.

Создание и удаление каталога описано в Javadoc от @TempDir:

Создание временного каталога

Временный каталог создается только в том случае, если поле в тестовом классе или параметр в методе жизненного цикла или методе тестирования помечено @TempDir. Если тип поля или тип параметра не является ни Path, ни File, или если временный каталог не может быть создан, будет выбрано ExtensionConfigurationException или ParameterResolutionException в зависимости от ситуации. Кроме того, для параметра конструктора с аннотацией @TempDir будет выбрано значение ParameterResolutionException.

Временная область каталога

Объем временного каталога зависит от того, где встречается первая аннотация @TempDir при выполнении тестового класса. Временный каталог будет общим для всех тестов в классе, если аннотация присутствует в поле static или в параметре метода @BeforeAll. В противном случае — например, когда @TempDir используется только в полях экземпляра или параметрах тестов, методов @BeforeEach или @AfterEach — каждый тест будет использовать свой собственный временный каталог.

Временное удаление каталога

Когда достигнут конец области действия временного каталога, т. е. когда тестовый метод или класс завершил выполнение, JUnit попытается рекурсивно удалить все файлы и каталоги во временном каталоге и, наконец, сам временный каталог. В случае сбоя удаления файла или каталога будет выдано IOException, что приведет к сбою теста или тестового класса.

person Slaw    schedule 15.06.2019
comment
А что делать с junit 5.3? Я застрял на старой версии... - person Juh_; 02.03.2020
comment
Я не думаю, что есть замена в версиях JUnit старше 5.4. Вам необходимо либо перейти на версию 5.4+, либо продолжить использование @EnableRuleMigrationSupport. Хотя я полагаю, что вы могли бы написать собственное расширение. - person Slaw; 02.03.2020