Como acessar recursos de teste no Scala?

137

Eu tenho um arquivo data.xmlem src/test/resources/.

Como posso ler esse arquivo em um novo FileReaderno meu teste data.scalaem src/test/scala/?

Aaron Yodaiken
fonte

Respostas:

202

Os recursos devem ser acessados ​​usando os getResourcemétodos de estilo especiais que o Java fornece. Dado o seu exemplo de data.xmlparticipação $SBT_PROJECT_HOME/src/test/resources/, você pode acessá-lo em um teste como este:

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

Claro que source agora é apenas um objeto Scala IO normal para que você possa fazer o que quiser com ele, como ler o conteúdo e usá-lo para dados de teste.

Existem outros métodos para obter o recurso também (por exemplo, como um fluxo). Para obter mais informações, consulte os getResourcemétodos no Java Docs: Class .

Mitchell
fonte
8
Eu tive que adicionar um getClassLoaderà instrução. O resultado foiSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius
1
getClassLoaderÉ necessário um comentário confirmado de Moebius . Sem ele, o caminho inclui o diretório de hierarquia de classes da classe de teste. Algo como ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. Usando getClass.getClassLoader.getResource()a porção com/mycompany/myapp/module1/utils/blabla/é removido
Polimerase em
28

Outra alternativa (especialmente se você precisar acessar o recurso como a File); é obter seu caminho via:

val path = getClass.getResource("/testData.txt").getPath
val file = new File(path)

como foi apontado no Scala, obtenha o caminho do arquivo na pasta de recursos

Neil
fonte
24

sbt copia arquivos de src/test/resourcesparatarget/scala-[scalaVersion]/test-classes .

Você pode acessar os recursos em seus testes da seguinte maneira:

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

Ele assume que testData.txtestava diretamente sob a pasta src/test/resources. Adicione quaisquer subdiretórios, caso contrário.

Nick A Miller
fonte
0

E nos casos em getClass.getResourceque não funciona (não sabe nem se importa quando ou por que exatamente), o com.google.common.io.Resources.getResourceGoogle Guava geralmente funciona

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

Para saber onde você está no sistema de arquivos durante o teste, você pode fazer algo assim em um teste fictício:

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

Então, quando você conhece seu caminho, em seu teste, você pode usá-lo como:

new File("./src/test/resources/yourfile.xml")
heralight
fonte
Os arquivos em src/test/resourcesestão no CLASSPATH do teste, para que os testes possam acessá-lo sem que o código esteja ciente da estrutura do diretório de construção.
Jacek Laskowski
2
Isso pode ser útil, se for necessário enumerar recursos (ou seja, o código não tem seus nomes corrigidos, mas usará todos os arquivos colocados lá).
akauppi
@akauppi isso pode ser feito com docs.spring.io/spring-framework/docs/2.5.x/api/org/…
dk14
isto irá colocar você em problemas quando você implantar seu aplicativo como um frasco de gordura
Alex Monras