Как получить доступ к тестовым ресурсам в Scala?

138

У меня есть файл data.xmlв формате src/test/resources/.

Как я могу прочитать этот файл в новый FileReaderв моем тесте data.scalaв src/test/scala/?

Аарон Йодайкен
источник

Ответы:

204

Ресурсы предназначены для доступа с использованием специальных getResourceметодов стиля, которые предоставляет Java. Учитывая ваш пример , data.xmlнаходясь в $SBT_PROJECT_HOME/src/test/resources/, вы можете получить доступ к нему в тесте , как так:

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

Конечно, sourceтеперь это обычный объект ввода-вывода Scala, так что вы можете делать с ним все, что захотите, например читать содержимое и использовать его для тестовых данных.

Есть и другие методы получения ресурса (например, в виде потока). Для получения дополнительной информации просмотрите getResourceметоды в Java Docs: Class .

Митчелл
источник
8
Пришлось добавить getClassLoaderв инструкцию. Результат былSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Мебиус
1
Подтвержденный комментарий Мебиуса getClassLoaderнеобходим. Без него путь включает каталог иерархии классов тестового класса. Что-то вроде ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. Использование getClass.getClassLoader.getResource()порции com/mycompany/myapp/module1/utils/blabla/удалено
Полимераза
24

sbt копирует файлы из src/test/resourcesв target/scala-[scalaVersion]/test-classes.

Вы можете получить доступ к ресурсам в ваших тестах следующим образом:

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

Предполагается, что это testData.txtбыло прямо в папке src/test/resources. В противном случае добавьте подкаталоги.

Ник А. Миллер
источник
0

А в случаях, когда getClass.getResourceне работает (не знаю и не волнует, когда и почему именно), com.google.common.io.Resources.getResourceиз Google Guava обычно работает

testCompile "com.google.guava:guava:18.0"
Осейскар
источник
-4

Чтобы узнать, где вы находитесь в файловой системе во время теста, вы можете сделать что-то вроде этого в фиктивном тесте:

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

Затем, когда вы знаете свой путь, в своем тесте вы можете использовать его как:

new File("./src/test/resources/yourfile.xml")
Heralight
источник
Файлы ниже src/test/resourcesнаходятся в CLASSPATH теста, поэтому тесты могут получить к нему доступ без того, чтобы код знал о структуре каталога сборки.
Яцек Ласковски
2
Однако это может быть полезно, если нужно перечислить ресурсы (т.е. в коде не зафиксированы их имена, но будут использоваться любые файлы, помещенные в него).
akauppi
@akauppi, это можно сделать с помощью docs.spring.io/spring-framework/docs/2.5.x/api/org/…
dk14,
это доставит вам неприятности, когда вы развернете свое приложение как толстую банку
Alex Monras 09