Scalaのテストリソースにアクセスする方法


137

私は、ファイル持っているdata.xmlではsrc/test/resources/

FileReaderテストdata.scalaでそのファイルを新しいファイルに読み込むにはどうすればよいsrc/test/scala/ですか?

回答:


202

リソースはgetResource、Javaが提供する特別なスタイルのメソッドを使用してアクセスするためのものです。に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は、Java Docs:Classのメソッドを参照してください。


8
getClassLoader命令にを追加する必要がありました。結果はSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
メビウス

1
確認済みのメビウスのコメントgetClassLoaderが必要です。これがない場合、パスにはテストクラスのクラス階層ディレクトリが含まれます。のようなもの ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/getClass.getClassLoader.getResource()部分の使用com/mycompany/myapp/module1/utils/blabla/は削除されました
ポリメラーゼ2018


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.getResourceグアバから

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、2014

2
これは、リソースを列挙する必要がある場合に役立ちます(つまり、コードの名前は固定されていませんが、その下に配置されたファイルを使用します)。
akauppi 2015年

@akauppiこれは、docs.spring.io / spring
framework /

これにより、アプリをファットjarとしてデプロイするときに問題が発生します
Alex Monras
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.