¿Cómo acceder a los recursos de prueba en Scala?

137

Tengo un archivo data.xmladentro src/test/resources/.

¿Cómo puedo leer ese archivo en un nuevo FileReader en mi prueba data.scalade src/test/scala/?

Aaron Yodaiken
fuente

Respuestas:

202

Se debe acceder a los recursos utilizando los getResourcemétodos de estilo especiales que proporciona Java. Dado su ejemplo de data.xmlestar en $SBT_PROJECT_HOME/src/test/resources/, puede acceder a él en una prueba como esta:

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

Por supuesto que source ahora es solo un objeto Scala IO normal para que pueda hacer lo que quiera con él, como leer el contenido y usarlo para datos de prueba.

También hay otros métodos para obtener el recurso (por ejemplo, como una secuencia). Para obtener más información, consulte los getResourcemétodos en Java Docs: Class .

Mitchell
fuente
8
Tuve que agregar un getClassLoadera la instrucción. El resultado fueSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius el
1
getClassLoaderSe necesita un comentario confirmado de Moebius . Sin ella, la ruta incluye el directorio de jerarquía de clases de la clase de prueba. Algo así como ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. Se elimina getClass.getClassLoader.getResource()el uso de la porcióncom/mycompany/myapp/module1/utils/blabla/
Polimerasa
24

sbt copia archivos de src/test/resourcesatarget/scala-[scalaVersion]/test-classes .

Puede acceder a los recursos en sus pruebas de la siguiente manera:

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

Asume que testData.txtestaba directamente debajo de la carpeta src/test/resources. Agregue cualquier subdirectorio, de lo contrario.

Nick A Miller
fuente
0

Y en los casos en getClass.getResourceque no funciona (no sé ni me importa cuándo o por qué exactamente), com.google.common.io.Resources.getResourcegeneralmente lo hace Google Guava

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

Para saber dónde se encuentra en el sistema de archivos durante la prueba, puede hacer algo como esto en una prueba ficticia:

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

Luego, cuando conozca su camino, en su prueba puede usarlo como:

new File("./src/test/resources/yourfile.xml")
heralight
fuente
Los archivos debajo src/test/resourcesestán en CLASSPATH de prueba para que las pruebas puedan acceder a él sin que el código tenga en cuenta la estructura del directorio de compilación.
Jacek Laskowski
2
Sin embargo, esto podría ser útil si uno necesita enumerar recursos (es decir, el código no tiene sus nombres fijos, pero usará los archivos colocados debajo).
akauppi
@akauppi esto se puede hacer con docs.spring.io/spring-framework/docs/2.5.x/api/org/…
dk14
esto lo meterá en problemas cuando implemente su aplicación como un tarro gordo
Alex Monras