스칼라의 테스트 리소스에 액세스하는 방법?


137

에 파일 data.xmlsrc/test/resources/있습니다.

FileReader내 테스트 data.scala에서 해당 파일을 새 파일로 어떻게 읽을 수 src/test/scala/있습니까?

답변:


202

자원은 getResourceJava가 제공 하는 특수 스타일 메소드를 사용하여 액세스 해야합니다. 당신의 예를 감안할 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이제는 일반적인 스칼라 IO 객체이므로 내용을 읽고 테스트 데이터로 사용하는 등 원하는 모든 작업을 수행 할 수 있습니다.

리소스를 얻는 다른 방법 (예 : 스트림)도 있습니다. 자세한 정보 getResourceJava Docs : Class 의 메소드 를 참조하십시오 .


8
getClassLoader지시에 를 추가해야했습니다 . 결과 :Source.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius

1
확인 된 Moebius 의견 getClassLoader이 필요합니다. 이것이 없으면 경로에는 테스트 클래스의 클래스 계층 디렉토리가 포함됩니다. 같은 것 ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. getClass.getClassLoader.getResource()부분 사용 com/mycompany/myapp/module1/utils/blabla/제거
Polymerase


24

sbt는에서 src/test/resources로 파일을 복사합니다 target/scala-[scalaVersion]/test-classes.

다음과 같이 테스트의 리소스에 액세스 할 수 있습니다.

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

testData.txt폴더 바로 아래에 있다고 가정 합니다 src/test/resources. 그렇지 않으면 하위 디렉토리를 추가하십시오.


0

그리고 Google Guava에서 getClass.getResource작동하지 않는 경우 (정확한시기 또는 이유를 정확히 알지 못하거나 걱정하지 않는 경우)com.google.common.io.Resources.getResource

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에 있으므로 테스트에서 빌드 디렉토리 구조를 인식하지 않고도 파일에 액세스 할 수 있습니다.
Jacek Laskowski

2
리소스를 열거해야하는 경우에 유용합니다 (예 : 코드의 이름이 고정되어 있지 않지만 그 아래에있는 파일을 사용함).
akauppi


앱을 뚱뚱한 항아리로 배포하면 문제가 생길 수 있습니다.
Alex Monras
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.