Wie greife ich in Scala auf Testressourcen zu?

137

Ich habe eine Datei data.xmlin src/test/resources/.

Wie kann ich diese Datei in ein neues lesen FileReaderin meinem Test data.scalain src/test/scala/?

Aaron Yodaiken
quelle

Antworten:

202

Der Zugriff auf Ressourcen soll mit den von getResourceJava bereitgestellten speziellen Stilmethoden erfolgen. Angesichts Ihrem Beispiel data.xmlist in $SBT_PROJECT_HOME/src/test/resources/, Sie darauf zugreifen können in einem Test wie folgt:

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"))

Natürlich sourceist das jetzt nur noch ein normales Scala-E / A-Objekt, sodass Sie damit alles tun können, was Sie wollen, z. B. den Inhalt lesen und für Testdaten verwenden.

Es gibt auch andere Methoden, um die Ressource abzurufen (z. B. als Stream). Weitere Informationen finden Sie in den getResourceMethoden in Java Docs: Class .

Mitchell
quelle
8
Ich musste getClassLoaderder Anweisung ein hinzufügen . Das Ergebnis warSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Möbius
1
Bestätigter Möbius-Kommentar getClassLoaderist erforderlich. Ohne sie enthält der Pfad das Klassenhierarchieverzeichnis der Testklasse. So etwas wie ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. Verwendung getClass.getClassLoader.getResource()der Portion com/mycompany/myapp/module1/utils/blabla/wird entfernt
Polymerase
24

sbt kopiert Dateien von src/test/resourcesnach target/scala-[scalaVersion]/test-classes.

Sie können wie folgt auf die Ressourcen in Ihren Tests zugreifen:

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

Es wird davon ausgegangen, dass testData.txtsich das direkt unter dem Ordner befand src/test/resources. Fügen Sie andernfalls Unterverzeichnisse hinzu.

Nick A Miller
quelle
0

Und in Fällen, in denen getClass.getResourcedies nicht funktioniert (weiß nicht, wann oder warum genau), com.google.common.io.Resources.getResourcefunktioniert dies normalerweise bei Google Guava

testCompile "com.google.guava:guava:18.0"
oseiskar
quelle
-4

Um zu wissen, wo Sie sich während des Tests im Dateisystem befinden, können Sie in einem Dummy-Test Folgendes tun:

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

Wenn Sie Ihren Pfad kennen, können Sie ihn in Ihrem Test wie folgt verwenden:

new File("./src/test/resources/yourfile.xml")
heralight
quelle
Die Dateien unter src/test/resourcesbefinden sich im CLASSPATH des Tests, sodass Tests darauf zugreifen können, ohne dass der Code die Build-Verzeichnisstruktur kennt.
Jacek Laskowski
2
Dies kann jedoch nützlich sein, wenn Ressourcen aufgelistet werden müssen (dh der Code hat keine festen Namen, verwendet jedoch alle dort platzierten Dateien).
Akauppi
Dies wird Sie in Schwierigkeiten bringen, wenn Sie Ihre App als Fat Jar bereitstellen
Alex Monras