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

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 .


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


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.


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"

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

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


isto irá colocar você em problemas quando você implantar seu aplicativo como um frasco de gordura
Alex Monras
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.