Comment accéder aux ressources de test dans Scala?

137

J'ai un fichier data.xmldans src/test/resources/.

Comment puis-je lire ce fichier dans un nouveau FileReaderdans mon test data.scalaensrc/test/scala/ ?

Aaron Yodaiken
la source

Réponses:

202

Les ressources sont destinées à être accessibles à l'aide des getResourceméthodes de style spéciales fournies par Java. Compte tenu de votre exemple d' data.xmlêtre dans $SBT_PROJECT_HOME/src/test/resources/, vous pouvez y accéder à un test comme ceci:

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

Bien sûr, il ne sources'agit plus que d'un objet Scala IO normal, vous pouvez donc en faire tout ce que vous voulez, comme lire le contenu et l'utiliser pour les données de test.

Il existe également d'autres méthodes pour obtenir la ressource (par exemple sous forme de flux). Pour plus d'informations, consultez les getResourceméthodes de Java Docs: Class .

Mitchell
la source
8
J'ai dû ajouter un getClassLoaderà l'instruction. Le résultat étaitSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius
1
Un commentaire Moebius confirmé getClassLoaderest nécessaire. Sans lui, le chemin comprend le répertoire de la hiérarchie des classes de la classe de test. Quelque chose comme ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. Utilisation de getClass.getClassLoader.getResource()la portion com/mycompany/myapp/module1/utils/blabla/est supprimée
Polymerase
28

Une autre alternative (surtout si vous devez accéder à la ressource en tant que a File); consiste à obtenir son chemin via:

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

comme cela a été souligné dans Scala, obtenir le chemin du fichier dans le dossier des ressources

Neil
la source
24

sbt copie les fichiers de src/test/resourcesàtarget/scala-[scalaVersion]/test-classes .

Vous pouvez accéder aux ressources de vos tests comme suit:

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

Il suppose que testData.txtc'était directement sous le dossier src/test/resources. Ajoutez des sous-répertoires, sinon.

Nick A Miller
la source
0

Et dans les cas où getClass.getResourcecela ne fonctionne pas (je ne sais pas, je ne sais pas quand ou pourquoi exactement), com.google.common.io.Resources.getResourcede Google Guava le fait généralement

testCompile "com.google.guava:guava:18.0"
oseiskar
la source
-4

Pour savoir où vous vous trouvez dans le système de fichiers pendant le test, vous pouvez faire quelque chose comme ceci dans un test factice:

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

Ensuite, lorsque vous connaissez votre chemin, dans votre test, vous pouvez l'utiliser comme:

new File("./src/test/resources/yourfile.xml")
heralight
la source
Les fichiers sous src/test/resourcessont dans le CLASSPATH de test afin que les tests puissent y accéder sans que le code soit conscient de la structure du répertoire de construction.
Jacek Laskowski
2
Cela peut être utile si l'on a besoin d'énumérer les ressources (c'est-à-dire que le code n'a pas leurs noms fixes, mais utilisera tous les fichiers placés en dessous).
akauppi
@akauppi cela peut être fait avec docs.spring.io/spring-framework/docs/2.5.x/api/org/…
dk14
cela vous
causera des