我正在将单元测试从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条答案
按热度按时间ttp71kqs1#
您可以使用
@TempDir
注解(JUnit 5.4+),在JUnit 5用户指南的§2.20.1中有描述。内置的
TempDirectory
扩展用于为测试类中的单个测试或所有测试创建和清理临时目录。**默认情况下它是注册的。**要使用它,注解非类型为java.nio.file.Path
或java.io.File
且带有@TempDir
的私有字段,或者将带有@TempDir
注解的类型为java.nio.file.Path
或java.io.File
的参数添加到生命周期方法、或测试方法。5.4
版本中添加的,目前(从5.8.2
开始)处于实验阶段。*使用示例字段的示例:
使用测试方法参数的示例:
***注意:*不支持构造函数参数。
the Javadoc of
@TempDir
(引用自JUnit 5.8.2的文档)中描述了何时创建和删除目录:创建
仅当测试类中的字段或生命周期方法或测试方法中的参数使用
@TempDir
进行注解时,才会创建临时目录。如果字段类型或参数类型既不是Path
也不是File
,或者无法创建临时目录,则会根据需要引发ExtensionConfigurationException
或ParameterResolutionException
。此外,对于使用@TempDir
注解的构造函数参数,将引发ParameterResolutionException
。范围
默认情况下,会为
@TempDir
注解的每个声明创建一个单独的临时目录。如果要在测试类中的所有测试之间共享一个临时目录,则应在static
字段或@BeforeAll
方法的参数上声明注解。旧行为
您可以通过将
junit.jupiter.tempdir.scope
配置参数设置为per_context
来恢复到使用单个临时目录的旧行为。临时目录的范围取决于在执行测试类时遇到第一个@TempDir
注解的位置。当注解出现在static
字段或@BeforeAll
方法的参数上时,缓存目录会由类别中的所有测试共用。否则-例如,当@TempDir
仅用于示例字段或test、@BeforeEach
或@AfterEach
方法中的参数时-每个测试将使用其自己的临时目录。删除
当到达临时目录的作用域的末尾时,即当测试方法或类完成执行时,JUnit将尝试递归删除临时目录中的所有文件和目录,最后删除临时目录本身。如果删除文件或目录失败,则会抛出
IOException
,这将导致测试或测试类失败。