我正在将单元测试从 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
注释 (JUnit 5.4+),如《JUnit 5 用户指南》§2.22.1 中所述。来自用户指南(重点我的):
内置的API 状态说明:
TempDirectory
扩展用于为单个测试或测试类中的所有测试创建和清理临时目录。它是默认注册的。 要使用它,请使用java.nio.file.Path
注释类型为java.io.File
或@TempDir
的非私有字段,或者添加使用java.nio.file.Path
注释的java.io.File
或@TempDir
类型的参数到生命周期方法或测试方法。
@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
}
使用测试方法参数的示例:
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...
}
}
注意: 不支持构造函数参数。
创建和删除目录的时间在的 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"