如何使用Play框架读取测试代码中的资源?

时间:2018-09-11 04:31:20

标签: scala testing playframework

问题

我找不到如何在Play框架中将资源包含在测试代码中。

我要编写getResource代码@ / test / controllers / HomeControllerSpec.scala如下。

"HomeController Test" should {
  val inputStream = getClass.getResourceAsStream("test.json")
  ...
}

但是此代码要求将“ test.json”放置在目标目录中。 我找到了一种使用Inject和play.api.Environment的方法,但是这种方法在测试代码中效果不佳。

Getting a resource file as an InputStream in Playframework

是否有最佳实践来读取测试代码中的资源?

其他信息

我尝试了以下代码@ /play/test/controllers/HomeControllerSpec.scala

val source = getClass.getResource("/").getPath
println(source.toString())

我也得到了以下结果(/ play是play项目的根)。

/play/target/scala-2.12/test-classes/

通常,/ target被忽略(用.gitignore编写)。因此,我想知道在Play测试代码(放置在/ test中)中读取文本文件的方式。

解决方案(已解决。感谢您的评论和帮助。)

我尝试了以下命令

sbt "show test:resourceDirectory"

并得到以下结果。

/play/test/resources

这意味着放置在此目录中的文件将用作资源并复制到目标目录(在我的情况下为/play/target/scala-2.12/test-classs)。所以我把test.json放在

/play/test/resources/test.json

,并可以通过以下代码读取此文件。

val source = getClass.getResource("/test.json").getPath
val code = getClass.getResourceAsStream("/test.json")
println("getPath of test.json: "+ source)
println("text of test.json: " + IOUtils.toString(code))

输出

getPath of test.json: /play/target/scala-2.12/test- 
classes/test.json
text of test.json: {
     "key": "value"
}

1 个答案:

答案 0 :(得分:1)

您的项目目录结构(播放框架)

  • /
    • / app
    • / conf
    • /测试
      • test.json
      • /控制器
        • HomeControllerSpec.scala

您无法从test.json访问/test的原因

  • 源路径(/app/test)中除“ * .scala”以外的任何文件均不包括在内。
  • 编译时排除test.json中的
  • /test

替代方式

test.json放入/test/resources

  • /
    • / app
    • / conf
    • /测试
      • /资源
        • test.json
      • /控制器
        • HomeControllerSpec.scala

也请阅读