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/ ?

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 .


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


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.


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"

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.