如何在Junit5中取消TemporaryFolder规则

20

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

@EnableRuleMigrationSupport
public final class SomeTest {

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

   // tests ...
}

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

33

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

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

创建

只有在测试类的字段或生命周期方法或测试方法的参数中注释了@TempDir,临时目录才会被创建。如果字段类型或参数类型既不是Path也不是File,或者无法创建临时目录,则会相应地抛出ExtensionConfigurationExceptionParameterResolutionException。此外,对于用@TempDir注释的构造函数参数,将抛出一个ParameterResolutionException

范围

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

旧行为

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

删除

当临时目录的范围结束时,即测试方法或类执行完成时,JUnit将尝试递归删除临时目录中的所有文件和目录,并最终删除临时目录本身。如果删除文件或目录失败,则会抛出一个IOException,导致测试或测试类失败。


那么JUnit 5.3怎么办呢?我被困在旧版本中了... - Juh_
我认为在JUnit 5.4之前的版本中没有替代方法。你要么升级到5.4+,要么继续使用@EnableRuleMigrationSupport。虽然我想你可以编写自己的扩展 - Slaw
1
在JUnit 5.8中,@TempDir也可以是私有的 - 参见允许@TempDir字段为私有 - bjmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接