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

154

我在src/test/resources/目录下有一个名为data.xml的文件。

我该如何在src/test/scala/目录下的测试文件data.scala中将该文件读入到一个新的FileReader对象中呢?

5个回答

222

资源应该使用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 Docs: Class上的getResource方法。

10
我需要在指令中添加一个 getClassLoader。结果是 Source.fromURL(getClass.getClassLoader.getResource("simulation.json")) - Moebius
2
确认 Moebius 评论中需要使用 getClassLoader。如果没有它,路径将包括测试类的类层次结构目录。类似于 ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/。使用 getClass.getClassLoader.getResource() 将删除 com/mycompany/myapp/module1/utils/blabla/ 部分。 - Polymerase
1
对于类层次结构,我并没有这种情况,但是使用getClassLoader时,在资源名称中不需要斜杠,而在没有使用getClassLoader时则需要。如果不是这样使用,我将始终得到null(找不到资源)。 - yuranos

39

另一个选择(特别是如果你需要将资源作为File访问);是通过以下方式获取其路径:

另一种选择(尤其是如果您需要将资源作为File进行访问);是通过以下方式获取它的路径:

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

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


27

sbt将文件从src/test/resources复制到target/scala-[scalaVersion]/test-classes目录中。

您可以按以下方式在测试中访问这些资源:

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

这假设 testData.txt 直接在 src/test/resources 文件夹下。如果加了任何子文件夹就会出错。


0
在某些情况下,getClass.getResource无法正常工作(不知道也不关心具体何时何地以及为什么),通常可以使用Google Guava的com.google.common.io.Resources.getResource
testCompile "com.google.guava:guava:18.0"

-5

为了在测试过程中知道你在文件系统中的位置,可以在一个虚拟测试(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
2
这可能很有用,特别是当需要枚举资源时(即代码没有固定的名称,但将使用放置在其中的任何文件)。 - akauppi
@akauppi 这可以使用http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/core/io/support/PathMatchingResourcePatternResolver.html完成。 - dk14
当你将应用程序部署为fat jar时,这会给你带来麻烦。 - Alex Monras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接