我正在将单元测试从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
规则? 最佳答案
您可以使用 @TempDir
中描述的§2.20.1 of the JUnit 5 User Guide批注(JUnit 5.4+)。从用户指南(强调我的):
内置的TempDirectory
扩展名用于为单个测试或测试类中的所有测试创建和清除临时目录。 默认情况下已注册。 要使用它,请使用java.nio.file.Path
注释java.io.File
或@TempDir
类型的非私有字段,或将使用java.nio.file.Path
注释的java.io.File
或@TempDir
类型的参数添加到生命周期方法或测试方法。
注意:此扩展名是在5.4
版本中添加的,目前(从5.5.1
开始)处于实验阶段。
使用实例字段的示例:
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; // must be non-private
}
使用测试方法的参数的示例:
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
中描述了创建和删除目录的时间:临时目录创建
仅当使用
@TempDir
注释测试类中的字段或生命周期方法或测试方法中的参数时,才创建临时目录。如果字段类型或参数类型既不是Path
也不是File
,或者如果无法创建临时目录,则将酌情引发ExtensionConfigurationException
或ParameterResolutionException
。另外,将为带有ParameterResolutionException
注释的构造函数参数抛出@TempDir
。临时目录范围
临时目录的范围取决于执行测试类时遇到第一个
@TempDir
注释的位置。当注释出现在static
字段或@BeforeAll
方法的参数上时,该类中的所有测试将共享该临时目录。否则(例如,当仅在实例字段或测试中的参数,@TempDir
或@BeforeEach
方法上使用@AfterEach
时),每个测试将使用其自己的临时目录。临时目录删除
当到达临时目录范围的末尾时,即当测试方法或类完成执行时,JUnit将尝试递归删除临时目录中的所有文件和目录,最后是临时目录本身。如果删除文件或目录失败,将抛出
IOException
,这将导致测试或测试类失败。