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


Answers:


202

使用getResourceJava提供的特殊样式方法可以访问资源。鉴于你的例子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 Docs:类getResource上的方法。


8
我必须getClassLoader在指令中添加一个。结果是Source.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius

1
getClassLoader需要经过确认的Moebius评论。没有它,路径将包含测试类的类层次结构目录。有点像 ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/。使用getClass.getClassLoader.getResource()部分com/mycompany/myapp/module1/utils/blabla/被删除
Polymerase '18


24

sbt将文件从复制src/test/resourcestarget/scala-[scalaVersion]/test-classes

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

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

它确实假定testData.txt该文件夹位于文件夹的正下方src/test/resources。否则,添加任何子目录。


0

getClass.getResource无法正常运作(既不知道也不在乎何时或为什么如此)的情况下,com.google.common.io.Resources.getResourceGoogle Guava通常会

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

-4

要知道测试期间文件系统中的位置,可以在虚拟测试中执行以下操作:

 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

2
但是,如果需要枚举资源(例如,代码没有固定名称,但将使用放置在其下的任何文件),这可能会很有用。
akauppi,2015年


当您将应用程序部署为胖子时,这会给您带来麻烦
Alex Monras
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.