我在src/test/resources/
目录下有一个名为data.xml
的文件。
我该如何在src/test/scala/
目录下的测试文件data.scala
中将该文件读入到一个新的FileReader
对象中呢?
资源应该使用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对象,您可以随意使用它,比如读取其内容并将其用作测试数据。getResource
方法。另一个选择(特别是如果你需要将资源作为File
访问);是通过以下方式获取其路径:
另一种选择(尤其是如果您需要将资源作为File
进行访问);是通过以下方式获取它的路径:
val path = getClass.getResource("/testData.txt").getPath
val file = new File(path)
正如在Scala 获取资源文件夹中文件的路径中所指出的那样
sbt将文件从src/test/resources
复制到target/scala-[scalaVersion]/test-classes
目录中。
您可以按以下方式在测试中访问这些资源:
Source.fromURL(getClass.getResource("/testData.txt"))
这假设 testData.txt
直接在 src/test/resources
文件夹下。如果加了任何子文件夹就会出错。
getClass.getResource
无法正常工作(不知道也不关心具体何时何地以及为什么),通常可以使用Google Guava的com.google.common.io.Resources.getResource
。testCompile "com.google.guava:guava:18.0"
为了在测试过程中知道你在文件系统中的位置,可以在一个虚拟测试(dummy test)中执行类似以下操作:
import scala.collection.JavaConversions._
for(file <- new File(".").listFiles ){
println(file.getAbsolutePath)
}
然后,当你知道了你的路径后,在你的测试中你可以这样使用它:
new File("./src/test/resources/yourfile.xml")
src/test/resources
目录下的文件位于测试的 CLASSPATH 中,因此测试可以访问它,而不需要代码意识到构建目录结构。 - Jacek Laskowski
getClassLoader
。结果是Source.fromURL(getClass.getClassLoader.getResource("simulation.json"))
。 - MoebiusgetClassLoader
。如果没有它,路径将包括测试类的类层次结构目录。类似于~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/
。使用getClass.getClassLoader.getResource()
将删除com/mycompany/myapp/module1/utils/blabla/
部分。 - Polymerase