Як отримати доступ до тестових ресурсів у Scala?


137

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

Як я можу прочитати цей файл в новий FileReaderв моєму тесті data.scalaв src/test/scala/?

Відповіді:


202

До ресурсів потрібно звернутися за допомогою спеціальних 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 .


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

Файли, що src/test/resourcesперебувають у тесті, знаходяться в тесті CLASSPATH, тому тести можуть отримати доступ до нього, не знаючи код про структуру каталогу каталогів.
Яцек Ласковський

2
Це може бути корисним, якщо потрібно перерахувати ресурси (тобто код не має фіксованих їх імен, але використовуватиме будь-які файли, розміщені там).
akauppi

@akauppi це можна зробити за допомогою docs.spring.io/spring-framework/docs/2.5.x/api/org/…
dk14

це призведе до неприємностей, коли ви розгорнете додаток у вигляді жирної баночки
Алекс Монрас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.