如何在 JUnit 5 中创建临时文件

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

我用 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 创建新文件。

java junit5
3个回答
13
投票

如果使用

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



2
投票
https://www.baeldung.com/junit-5-temporary-directory

),您可以使用 @Test void helloworld(@TempDir Path mydir) { System.out.println("helloworld() tempDir="+tempDir+" mydir="+mydir); assertFalse(Objects.equals(tempDir, mydir)); } 注释文件或路径,并使用

@TempDir
写入指定文件
java.nio.Files#write
代表其目标参数。
    


-1
投票
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. } }

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