Ho un file data.xml
in src/test/resources/
.
Come posso leggere quel file in un nuovo FileReader
nel mio test data.scala
in src/test/scala/
?
Ho un file data.xml
in src/test/resources/
.
Come posso leggere quel file in un nuovo FileReader
nel mio test data.scala
in src/test/scala/
?
Risposte:
Le risorse sono accessibili tramite gli speciali getResource
metodi di stile forniti da Java. Dato il tuo esempio di data.xml
essere dentro $SBT_PROJECT_HOME/src/test/resources/
, puoi accedervi in un test in questo modo:
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"))
Ovviamente source
ora è solo un normale oggetto Scala IO, quindi puoi fare tutto quello che vuoi, come leggere i contenuti e usarlo per i dati di test.
Esistono altri metodi per ottenere anche la risorsa (ad esempio come flusso). Per ulteriori informazioni, consultare i getResource
metodi su Java Docs: Class .
getClassLoader
È necessario il commento confermato di Moebius . Senza di essa il percorso include la directory della gerarchia di classi della classe di test. Qualcosa del genere ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/
. La getClass.getClassLoader.getResource()
porzione com/mycompany/myapp/module1/utils/blabla/
viene rimossa
Un'altra alternativa (soprattutto se è necessario accedere alla risorsa come a File
); è ottenere il suo percorso tramite:
val path = getClass.getResource("/testData.txt").getPath
val file = new File(path)
come è stato sottolineato in Scala ottenere il percorso del file nella cartella delle risorse
sbt copia i file da src/test/resources
a target/scala-[scalaVersion]/test-classes
.
È possibile accedere alle risorse nei test come segue:
Source.fromURL(getClass.getResource("/testData.txt"))
Presuppone che testData.txt
fosse direttamente sotto la cartella src/test/resources
. Aggiungi eventuali sottodirectory, altrimenti.
Per sapere dove ti trovi nel file system durante il test, puoi fare qualcosa del genere in un test fittizio:
import scala.collection.JavaConversions._
for(file <- new File(".").listFiles ){
println(file.getAbsolutePath)
}
Quindi, quando conosci il tuo percorso, nel test puoi usarlo come:
new File("./src/test/resources/yourfile.xml")
src/test/resources
sono in CLASSPATH del test, quindi i test possono accedervi senza che il codice sia a conoscenza della struttura della directory di build.
getClassLoader
a l'istruzione. Il risultato fuSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))