java 设计幂等单元测试

hec6srdp  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(165)

我正在为以下方法设计单元测试:

public void loadFile(Path filename) throws IOException {
    try {
        // do something
    } catch (RuntimeException ex) {
        Files.move(filename, filename.resolveSibling("ERROR_" + filename.getFileName()));
        return;
    }

    Files.delete(filename);
}

我正在寻找一种测试它而不产生不同结果的方法,因为在执行测试之后输入文件将被重命名或删除:

  • 如果发生RuntimeException,则重命名文件。
  • 如果执行按预期进行,则删除文件。

无论哪种方式,连续运行测试都会使其失败,因为文件将被命名为不同的名称或它将不存在...我如何防止这种情况?另外,是否有方法验证Files#move(Path, Path, CopyOption...)Files#delete(Path)是否被调用?

rxztt3cl

rxztt3cl1#

我建议使用来自junit 5的新@TempDir注解。
Docs
当到达临时目录范围的末尾时,即当测试方法或类已经完成执行时,JUnit将尝试递归地删除临时目录中的所有文件和目录,最后删除临时目录本身。
在这种情况下,您的测试用例将如下所示:

@Test
void loadsFileCorrectly(@TempDir Path temp) {
    final Path file = temp.resolve("testable.file");
    loadFile(file);
    Assertions.assertTrue(Files.notExists(file));
}

@Test
void loadsFileWithException(@TempDir Path temp) {
    final Path file = temp.resolve("testable.file");
    loadFile(file);
    Assertions.assertTrue(Files.exists(file.resolveSibling("ERROR_" + file.getFileName())));
}

在这两种情况下,创建的文件将在执行后自动删除。

相关问题