[英]How to get rid of TemporaryFolder rule in Junit5
我正在将单元测试从 Junit4 迁移到 Junit5。 在测试中,我使用来自 Junit4 API 的TemporaryFolder
规则。 为了保持测试正常工作,我添加了@EnableRuleMigrationSupport
注释:
@EnableRuleMigrationSupport
public final class SomeTest {
@Rule
public final TemporaryFolder tmp = new TemporaryFolder();
// tests ...
}
据我了解,在 Junit5 中我需要使用extensions而不是rules ,但在 Junit5 扩展中我找不到任何替代TemporaryFolder
的东西。 它存在吗? 如何正确用扩展名替换TemporaryFolder
规则?
您可以使用JUnit 5 用户指南的 §2.20.1 中描述的@TempDir
注释 (JUnit 5.4+)。 从用户指南(强调我的):
内置的
TempDirectory
扩展用于为单个测试或测试类中的所有测试创建和清理临时目录。 默认情况下已注册。 要使用它,请使用@TempDir
注释java.nio.file.Path
或java.io.File
类型的非私有字段,或添加使用@TempDir
注释的java.nio.file.Path
或java.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
}
使用测试方法参数的示例:
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
,或者如果无法创建临时目录,则会酌情抛出ExtensionConfigurationException
或ParameterResolutionException
。 此外,对于使用@TempDir
注释的构造函数参数,将引发ParameterResolutionException
。范围
默认情况下,为
@TempDir
注释的每个声明创建一个单独的临时目录。 如果要在测试类中的所有测试之间共享临时目录,则应在static
字段或@BeforeAll
方法的参数上声明注释。旧行为
您可以通过将
junit.jupiter.tempdir.scope
配置参数设置为per_context
来恢复使用单个临时目录的旧行为。 在这种情况下,临时目录的范围取决于在执行测试类时遇到第一个@TempDir
注释的位置。 当注释出现在static
字段或@BeforeAll
方法的参数上时,临时目录将由类中的所有测试共享。 否则——例如,当@TempDir
仅用于实例字段或 test、@BeforeEach
或@AfterEach
方法中的参数时——每个测试将使用自己的临时目录。删除
当到达临时目录范围的末尾时,即当测试方法或类完成执行时,JUnit 将尝试递归删除临时目录中的所有文件和目录,最后是临时目录本身。 如果删除文件或目录失败,将抛出
IOException
导致测试或测试类失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.