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

101

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

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

Теги:
sbt

5 ответов

154
Лучший ответ

Доступ к ресурсам должен осуществляться с помощью специальных методов стиля 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 IO, поэтому вы можете делать с ним все, что хотите, например, читать содержимое и использовать его для тестовых данных.

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

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

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

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

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

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

8

Другая альтернатива (особенно если вам нужен доступ к ресурсу как File); это получить его путь через:

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

как указано в Scala получить путь к файлу файла в папке с ресурсами

0

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

testCompile "com.google.guava:guava:18.0"
-2

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

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

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

new File("./src/test/resources/yourfile.xml")
  • 0
    Файлы в каталоге src/test/resources находятся в тестовой CLASSPATH, поэтому тесты могут получить к ней доступ без знания кода структуры структуры каталога.
  • 2
    Это может быть полезно, хотя, если нужно перечислить ресурсы (т. Е. Код не имеет фиксированных имен, но будет использовать любые файлы, размещенные там).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню