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

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 .


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.


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"

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

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


esto lo meterá en problemas cuando implemente su aplicación como un tarro gordo
Alex Monras
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.