Come accedere alle risorse di test in Scala?


137

Ho un file data.xmlin src/test/resources/.

Come posso leggere quel file in un nuovo FileReadernel mio test data.scalain src/test/scala/?

Risposte:


202

Le risorse sono accessibili tramite gli speciali getResourcemetodi di stile forniti da Java. Dato il tuo esempio di data.xmlessere 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 sourceora è 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 getResourcemetodi su Java Docs: Class .


8
Ho dovuto aggiungere un getClassLoadera l'istruzione. Il risultato fuSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius, il

1
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
Polimerasi


24

sbt copia i file da src/test/resourcesa target/scala-[scalaVersion]/test-classes.

È possibile accedere alle risorse nei test come segue:

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

Presuppone che testData.txtfosse direttamente sotto la cartella src/test/resources. Aggiungi eventuali sottodirectory, altrimenti.


0

E nei casi in cui getClass.getResourcenon funziona (non so né importa quando o perché esattamente), com.google.common.io.Resources.getResourcedi solito Guava di Google

testCompile "com.google.guava:guava:18.0"

-4

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

I file sotto src/test/resourcessono in CLASSPATH del test, quindi i test possono accedervi senza che il codice sia a conoscenza della struttura della directory di build.
Jacek Laskowski,

2
Ciò può essere utile, tuttavia, se è necessario enumerare le risorse (ad esempio, il codice non ha i nomi fissi, ma utilizzerà tutti i file posizionati al di sotto).
akauppi,

@akauppi questo può essere fatto con docs.spring.io/spring-framework/docs/2.5.x/api/org/…
dk14

questo ti metterà nei guai quando distribuisci la tua app come un grosso vaso
Alex Monras,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.