如何在 Scala 单元测试中创建临时目录

Ram*_*gil 8 filesystems unit-testing scala scalatest

在 Scala 中,单元测试如何创建一个临时目录以用作测试的一部分?

我正在尝试对依赖于目录的类进行单元测试

class UsesDirectory(directory : java.io.File) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找以下形式的东西:

class UsesDirectorySpec extends FlatSpec {
  val tempDir = ??? //missing piece

  val usesDirectory = UsesDirectory(tempDir)

  "UsesDirectory" should {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,关于在单元测试完成后适当清理资源的任何评论/建议都会有所帮助。

预先感谢您的考虑和回应。

小智 9

Krzysztof 的回答提供了一个很好的策略,可以完全避免在测试中使用临时目录。

但是,如果您确实需要UsesDirectory处理真实文件,则可以执行以下操作来创建临时目录:

import java.nio.file.Files
val tempDir = Files.createTempDirectory("some-prefix").toFile
Run Code Online (Sandbox Code Playgroud)

关于清理,您可以使用 JVM 关闭挂钩机制来删除临时文件。

java.io.File确实提供了deleteOnExit()方法,但它不适用于非空目录)

您可以使用sys.addShutdownHook {},实现自定义关闭挂钩,并使用Files.walkFiles.walkTree删除临时目录的内容。

此外,您可能还想看看Better-files 库,它为常见文件操作提供了一个不太冗长的 scala API,包括File.newTemporaryDirectory()file.walk()