如何摆脱Junit5中的TemporaryFolder规则

问题描述 投票:0回答:1

我正在将单元测试从 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
规则?

java junit junit5
1个回答
34
投票

您可以使用

@TempDir
注释 (JUnit 5.4+),如《JUnit 5 用户指南》§2.22.1 中所述。来自用户指南(重点我的):

内置的

TempDirectory

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

API 状态说明:

API状态自从稳定5.10稳定5.11实验性5.10
@TempDir
@TempDir#cleanup()
@TempDir#factory()
使用实例字段的示例:

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.11.4 的文档):

创造

仅当测试类中的字段或生命周期方法或测试方法中的参数带有

@TempDir

注释时,才会创建临时目录。有下列情况之一的,将被抛出

ExtensionConfigurationException
ParameterResolutionException

如果字段类型或参数类型既不是
    Path
  • 也不是
    File
    如果字段声明为 
  • final
  • 如果无法创建临时目录。
  • 如果字段类型或参数类型为
  • File
  • 并且使用自定义工厂,则会创建不属于默认文件系统的临时目录。
    
    
  • 此外,对于带有
ParameterResolutionException

注释的构造函数参数,将会抛出

@TempDir
范围

默认情况下,会为

@TempDir

注释的每个声明创建一个单独的临时目录。如果您想在测试类中的所有测试之间共享临时目录,则应在

static
字段或
@BeforeAll
方法的参数上声明注释。
旧行为

您可以通过将

"junit.jupiter.tempdir.scope"

配置参数设置为

per_context
来恢复使用单个临时目录的旧行为。在这种情况下,临时目录的范围取决于执行测试类时遇到第一个
@TempDir
注释的位置。当注释出现在
static
字段或
@BeforeAll
方法的参数上时,临时目录将由类中的所有测试共享。否则 - 例如,当
@TempDir
仅用于实例字段或测试、
@BeforeEach
@AfterEach
方法中的参数时 - 每个测试将使用自己的临时目录。
清理

默认情况下,当到达临时目录范围的末尾时,当测试方法或类完成执行时,JUnit 将尝试通过递归删除临时目录中的所有文件和目录来清理临时目录,并且,最后,临时目录本身。如果删除文件或目录失败,将抛出

IOException

,这将导致测试或测试类失败。

cleanup()

属性允许您配置

CleanupMode
。如果清理模式设置为
NEVER
,则测试完成后不会清理临时目录。如果清理模式设置为
ON_SUCCESS
,则只有测试成功完成后才会清理临时目录。默认情况下,将使用
ALWAYS
清理模式,但可以通过设置
"junit.jupiter.tempdir.cleanup.mode.default"
配置参数进行全局配置。

    

© www.soinside.com 2019 - 2024. All rights reserved.