如何在Junit5中摆脱TemporaryFolder规则

时间:2019-06-15 20:21:44

标签: java junit junit5

我正在将单元测试从Junit4迁移到Junit5。在测试中,我使用的是Junit4 API中的TemporaryFolder rule。为了使测试正常进行,我添加了@EnableRuleMigrationSupport批注:

@EnableRuleMigrationSupport
public final class SomeTest {

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

   // tests ...
}

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

1 个答案:

答案 0 :(得分:4)

您可以使用@TempDir中所述的§2.19.1 of the JUnit 5 User Guide批注(JUnit 5.4+)。从用户指南(重点我的):

  

内置的TempDirectory扩展名用于为单个测试或测试类中的所有测试创建和清除临时目录。 默认情况下已注册。要使用它,请用java.nio.file.Path注释java.io.File@TempDir类型的字段或添加类型java.nio.file.Path的参数或用java.io.File注释的@TempDir到生命周期方法或测试方法。

注意:此扩展名是在5.4版中添加的,目前(自5.4起)处于试验阶段。

使用实例字段的示例:

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

class SomeTests {

    @TempDir
    Path directory; // must be public or package-private

}

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

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

class SomeTests {

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

}

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

the Javadoc of @TempDir中描述了创建和删除目录的时间:

  

临时目录创建

     

仅当测试类中的字段或生命周期方法或测试方法中的参数用@TempDir注释时,才创建临时目录。如果字段类型或参数类型既不是Path也不是File,或者无法创建临时目录,则将根据情况抛出ExtensionConfigurationExceptionParameterResolutionException。另外,将为ParameterResolutionException注释的构造函数参数抛出@TempDir

     

临时目录范围

     

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

     

临时目录删除

     

到达临时目录作用域的末尾时,即测试方法或类完成执行时,JUnit将尝试递归删除临时目录中的所有文件和目录,最后是临时目录本身。万一删除文件或目录失败,将抛出IOException,这将导致测试或测试类失败。