如何在 Scala 中访问测试资源?

我在 src/test/resources/中有一个文件 data.xml

如何在 src/test/scala/中的测试 data.scala中将该文件读入新的 FileReader中?

87258 次浏览

资源应该使用 Java 提供的特殊 getResource样式的方法来访问。考虑到 data.xml$SBT_PROJECT_HOME/src/test/resources/中的示例,您可以在如下测试中访问它:

import scala.io.Source


// The string argument given to getResource is a path relative to
// the resources directory.
val source = Source.fromURL(getClass.getResource("/data.xml"))

当然,source现在只是一个普通的 Scala IO 对象,因此您可以对它进行任何操作,比如读取内容并将其用于测试数据。

还有其他获取资源的方法(例如作为流)。有关更多信息,请查看 Java 文档: 类上的 getResource方法。

Sbt 将文件从 src/test/resources复制到 target/scala-[scalaVersion]/test-classes

您可以按以下方式访问测试中的资源:

Source.fromURL(getClass.getResource("/testData.txt"))

它确实假设 testData.txt直接位于文件夹 src/test/resources下。

要了解在测试期间您在文件系统中的位置,您可以在一个虚拟测试中执行以下操作:

 import scala.collection.JavaConversions._
for(file <- new File(".").listFiles ){
println(file.getAbsolutePath)
}

然后,当你知道你的路径,在你的测试中,你可以使用它作为:

new File("./src/test/resources/yourfile.xml")

另一种选择(特别是如果您需要以 File的形式访问资源)是通过以下方式获取它的路径:

val path = getClass.getResource("/testData.txt").getPath
val file = new File(path)

正如在 Scala 获取资源文件夹中文件的路径中指出的那样

getClass.getResource不工作的情况下(不知道也不关心什么时候或为什么确切) ,来自谷歌番石榴的 com.google.common.io.Resources.getResource通常工作

testCompile "com.google.guava:guava:18.0"