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

tnkciper  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(212)

我正在将单元测试从Junit4迁移到Junit5。在测试中,我使用了Junit4 API中的TemporaryFolderrule。为了保持测试正常运行,我添加了@EnableRuleMigrationSupport注解:

@EnableRuleMigrationSupport
public final class SomeTest {

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

   // tests ...
}

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

ttp71kqs

ttp71kqs1#

您可以使用@TempDir注解(JUnit 5.4+),在JUnit 5用户指南的§2.20.1中有描述。
内置的TempDirectory扩展用于为测试类中的单个测试或所有测试创建和清理临时目录。**默认情况下它是注册的。**要使用它,注解非类型为java.nio.file.Pathjava.io.File且带有@TempDir的私有字段,或者将带有@TempDir注解的类型为java.nio.file.Pathjava.io.File的参数添加到生命周期方法、或测试方法。

  • 注意:此扩展是在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

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

}

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

the Javadoc of @TempDir(引用自JUnit 5.8.2的文档)中描述了何时创建和删除目录:
创建
仅当测试类中的字段或生命周期方法或测试方法中的参数使用@TempDir进行注解时,才会创建临时目录。如果字段类型或参数类型既不是Path也不是File,或者无法创建临时目录,则会根据需要引发ExtensionConfigurationExceptionParameterResolutionException。此外,对于使用@TempDir注解的构造函数参数,将引发ParameterResolutionException

范围

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

旧行为

您可以通过将junit.jupiter.tempdir.scope配置参数设置为per_context来恢复到使用单个临时目录的旧行为。临时目录的范围取决于在执行测试类时遇到第一个@TempDir注解的位置。当注解出现在static字段或@BeforeAll方法的参数上时,缓存目录会由类别中的所有测试共用。否则-例如,当@TempDir仅用于示例字段或test、@BeforeEach@AfterEach方法中的参数时-每个测试将使用其自己的临时目录。

删除

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

相关问题