如何摆脱 Junit5 中的 TemporaryFolder 规则

Kir*_*ill 12 java junit junit5

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

@EnableRuleMigrationSupport
public final class SomeTest {

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

   // tests ...
}
Run Code Online (Sandbox Code Playgroud)

据我了解,在 Junit5 中我需要使用extensions而不是rules,但我TemporaryFolder在 Junit5 extensions 中找不到任何替代品。它存在吗?如何正确地TemporaryFolder用扩展替换规则?

Sla*_*law 21

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

内置TempDirectory扩展用于为单个测试或测试类中的所有测试创建和清理临时目录。它是默认注册的。要使用它,注释类型的非私有字段java.nio.file.Pathjava.io.File@TempDir或添加类型的参数java.nio.file.Pathjava.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

}
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

目录的创建和删除在Javadoc 中@TempDir有描述:

临时目录创建

仅当测试类中的字段或生命周期方法或测试方法中的参数带有注释时才会创建临时目录@TempDir。如果字段类型或参数类型既不是,Path也不File是临时目录或无法创建临时目录,则将适当抛出anExtensionConfigurationException或 a ParameterResolutionException。此外,ParameterResolutionException对于用 注释的构造函数参数,将抛出 a @TempDir

临时目录范围

临时目录的范围取决于@TempDir执行测试类时遇到第一个注解的位置。当注解出现在static字段或@BeforeAll方法的参数上时,临时目录将由类中的所有测试共享。否则——例如,当@TempDir仅用于实例字段或测试@BeforeEach、、或@AfterEach方法中的参数时——每个测试将使用自己的临时目录。

临时目录删除

当到达临时目录范围的末尾时,即当测试方法或类完成执行时,JUnit 将尝试递归删除临时目录中的所有文件和目录,最后删除临时目录本身。如果删除文件或目录失败,IOException将抛出一个将导致测试或测试类失败的错误。