Jak uzyskać dostęp do zasobów testowych w Scali?

137

Mam plik data.xmlw src/test/resources/.

Jak mogę wczytać ten plik do nowego FileReaderw moim teście data.scalaw src/test/scala/?

Aaron Yodaiken
źródło

Odpowiedzi:

202

Dostęp do zasobów ma być uzyskiwany przy użyciu specjalnych getResourcemetod stylu, które zapewnia Java. Biorąc pod uwagę twój przykład data.xmlbycia w $SBT_PROJECT_HOME/src/test/resources/, możesz uzyskać do niego dostęp w teście, takim jak ten:

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

Oczywiście sourcejest to teraz zwykły obiekt Scala IO, więc możesz z nim zrobić wszystko, co chcesz, na przykład czytać zawartość i używać go do testowania danych.

Istnieją również inne metody pobierania zasobu (na przykład jako strumień). Aby uzyskać więcej informacji, zapoznaj się z getResourcemetodami w dokumencie Java Docs: Class .

Mitchell
źródło
8
Musiałem dodać getClassLoaderdo instrukcji. Wynik byłSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius
1
Potwierdzony komentarz Moebiusa getClassLoaderjest potrzebny. Bez tego ścieżka zawiera katalog hierarchii klas klasy testowej. Coś jak ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. Korzystanie getClass.getClassLoader.getResource()z porcji com/mycompany/myapp/module1/utils/blabla/jest usuwane
Polymerase
28

Inna alternatywa (zwłaszcza jeśli potrzebujesz dostępu do zasobu jako a File); jest uzyskanie ścieżki poprzez:

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

jak wskazano w Scali, pobierz ścieżkę do pliku w folderze zasobów

Neil
źródło
24

sbt kopiuje pliki z src/test/resourcesdo target/scala-[scalaVersion]/test-classes.

Dostęp do zasobów w testach można uzyskać w następujący sposób:

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

Zakłada się, że testData.txtznajdował się bezpośrednio pod folderem src/test/resources. W przeciwnym razie dodaj dowolne podkatalogi.

Nick A Miller
źródło
0

A w przypadkach, getClass.getResourcegdy nie działa (nie wiem i nie obchodzi mnie, kiedy i dlaczego dokładnie), com.google.common.io.Resources.getResourcez Google Guava zwykle działa

testCompile "com.google.guava:guava:18.0"
oseiskar
źródło
-4

Aby wiedzieć, gdzie jesteś w systemie plików podczas testu, możesz zrobić coś takiego w teście fikcyjnym:

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

Następnie, kiedy już znasz swoją ścieżkę, w swoim teście możesz użyć jej jako:

new File("./src/test/resources/yourfile.xml")
heralight
źródło
Pliki poniżej src/test/resourcesznajdują się w ścieżce CLASSPATH testu, więc testy mogą uzyskać do niego dostęp bez wiedzy kodu o strukturze katalogu kompilacji.
Jacek Laskowski
2
Może się to jednak przydać, jeśli trzeba wyliczyć zasoby (np. Kod nie ma ustalonych nazw, ale będzie używał plików znajdujących się pod nim).
akauppi
@akauppi można to zrobić za pomocą docs.spring.io/spring-framework/docs/2.5.x/api/org/…
dk14
spowoduje to kłopoty, gdy wdrożysz aplikację jako gruby słoik
Alex Monras,