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

Posted

技术标签:

【中文标题】如何访问 Scala 中的测试资源?【英文标题】:How to access test resources in Scala? 【发布时间】:2011-07-14 05:48:08 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

资源旨在使用 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 方法。

【讨论】:

我必须在指令中添加一个getClassLoader。结果是Source.fromURL(getClass.getClassLoader.getResource("simulation.json")) 需要确认 Moebius 评论 getClassLoader。没有它,路径包括测试类的类层次目录。像~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/ 这样的东西。使用getClass.getClassLoader.getResource() 部分com/mycompany/myapp/module1/utils/blabla/ 被删除【参考方案2】:

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

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

正如Scala get file path of file in resources folder中指出的那样

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

如果getClass.getResource 不起作用(不知道也不关心确切的时间或原因),来自 Google Guava 的 com.google.common.io.Resources.getResource 通常会起作用

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

【讨论】:

【参考方案5】:

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

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

然后,当您知道自己的路径时,您可以在测试中将其用作:

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

【讨论】:

src/test/resources 下的文件位于 test 的 CLASSPATH 中,因此测试可以在代码不知道构建目录结构的情况下访问它。 这可能很有用,如果需要枚举资源(即代码没有固定它们的名称,但会使用放置在其中的任何文件)。 @akauppi 这可以通过docs.spring.io/spring-framework/docs/2.5.x/api/org/…完成 当您将应用部署为 fat jar 时,这会给您带来麻烦

以上是关于如何访问 Scala 中的测试资源?的主要内容,如果未能解决你的问题,请参考以下文章

更改 Scala 单元测试的 Flyway 资源位置

如何从Scala中的资源文件夹中读取文件?

如何在单元测试中模拟 ServletContext 以访问 WAR 资源?

无法从 Scala 中的资源文件夹中读取文件

C# 压力测试 - 模拟对给定共享资源的多次访问

Scala 都有哪些自动资源管理替代方案?