我用 JUnit 5 编写了一个单元测试,用于测试一些文件系统逻辑,我需要一个文件夹和一些文件。我在文档中找到了 TempDir 注释,并使用它创建了一个文件夹,在其中保存了一些文件。比如:
@TempDir
static Path tempDir;
static Path tempFile;
// ...
@BeforeAll
public static void init() throws IOException {
tempFile = Path.of(tempDir.toFile().getAbsolutePath(), "test.txt");
if (!tempFile.toFile().createNewFile()) {
throw new IllegalStateException("Could not create file " + tempFile.toFile().getAbsolutePath());
}
// ...
}
在 JUnit 4 中可以使用 TemporaryFolder#newFile(String)。 junit5 中似乎没有这个。
我错过了什么吗?它可以工作,所以我想这很好,但我想知道是否有一种更干净的方法可以直接使用 JUnit 5 API 创建新文件。
如果使用
Files
的内置方法,您可以简化获取临时文件的输入量。这是一个更简洁的定义,可以提供类似的错误处理:tempFile
确保您拥有最新版本的 JUnit 5。下面的测试应该会通过,但在某些旧版本的 JUnit 中会失败,这些版本不会为字段
@TempDir
static Path tempDir;
static Path tempFile;
@BeforeAll
public static void init() throws IOException {
tempFile = Files.createFile(tempDir.resolve("test.txt"));
}
和
@TempDir
生成唯一的 tempDir
值:mydir
),您可以使用 @Test void helloworld(@TempDir Path mydir) {
System.out.println("helloworld() tempDir="+tempDir+" mydir="+mydir);
assertFalse(Objects.equals(tempDir, mydir));
}
注释文件或路径,并使用
@TempDir
写入指定文件java.nio.Files#write
代表其目标参数。Path
注释很棒,除了一件烦人的事情:当 JVM 关闭时(测试完成时),临时目录中的文件将被删除。之后您将无法检查这些文件。为了解决这个问题,我创建了一个简单的 Java 包,并带有替代的
@TempDir
注释,如果您使用 Maven 或 Gradle(它们将临时文件保存在 @Mktmp
目录中),这会特别方便:target/
它位于GitHub 上
和 Maven Central:
import com.yegor256.Mktmp;
import com.yegor256.MktmpResolver;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MktmpResolver.class)
class FooTest {
@Test
void worksFine(@Mktmp Path tmp) {
// The "tmp" directory is a subdirectory of
// the "target/mktmp/" directory, where all
// temporary directories of all tests will
// be kept, in order to help you review the
// leftovers after failed (or passed) tests.
}
}