如何在 Junit5 中摆脱临时文件夹规则

2022-09-03 05:34:57

我正在将单元测试从 Junit4 迁移到 Junit5。在测试中,我使用的是Junit4 API中的规则。为了保持测试工作,我添加了注释:TemporaryFolder@EnableRuleMigrationSupport

@EnableRuleMigrationSupport
public final class SomeTest {

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

   // tests ...
}

据我所知,在 Junit5 中,我需要使用扩展而不是规则,但我找不到 Junit5 扩展的任何替代项。它存在吗?如何正确用扩展替换规则?TemporaryFolderTemporaryFolder


答案 1

您可以使用 JUnit 5 用户指南的 §2.20.1 中描述的@TempDir注释 (JUnit 5.4+)。从用户指南(强调我的):

内置扩展用于为单个测试或测试类中的所有测试创建和清理临时目录。默认情况下,该目录是注册的。要使用它,请对非私有字段进行批注,或者将类型参数或注释为生命周期方法或测试方法添加参数。TempDirectoryjava.nio.file.Pathjava.io.File@TempDirjava.nio.file.Pathjava.io.File@TempDir

注意:此扩展是在 5.4 版中添加的,目前(自 5.8.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; // may be private since 5.8

}

允许@TempDir字段为私有 #2687

使用测试方法参数的示例:

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

}

注意:不支持构造函数参数。

创建和删除目录时,@TempDir的 Javadoc 中进行了描述(JUnit 5.8.2 中的文档引用):

创造

仅当测试类中的字段或生命周期方法或测试方法中的参数用 注释时,才会创建临时目录。如果字段类型或参数类型既不是,也不是,或者无法创建临时目录,则将根据需要抛出 an 或 a。此外,将为带有 注释的构造函数参数抛出 一个。@TempDirPathFileExtensionConfigurationExceptionParameterResolutionExceptionParameterResolutionException@TempDir

范围

默认情况下,将为批注的每个声明创建一个单独的临时目录。如果要在测试类中的所有测试之间共享临时目录,则应在字段或方法的参数上声明批注。@TempDirstatic@BeforeAll

旧行为

通过将配置参数设置为 ,可以恢复到使用单个临时目录的旧行为。在这种情况下,临时目录的作用域取决于执行测试类时遇到第一个批注的位置。当批注出现在字段或方法的参数上时,类中的所有测试都将共享临时目录。否则,例如,当 仅用于实例字段或 test 中的参数或方法时,每个测试都将使用自己的临时目录。junit.jupiter.tempdir.scopeper_context@TempDirstatic@BeforeAll@TempDir@BeforeEach@AfterEach

删除

当到达临时目录的作用域结束时,即当测试方法或类完成执行时,JUnit 将尝试递归删除临时目录中的所有文件和目录,最后删除临时目录本身。如果删除文件或目录失败,将引发 一个,这将导致测试或测试类失败。IOException


答案 2

推荐