Bagaimana cara mengakses sumber daya uji di Scala?

138

Saya memiliki file data.xmldi src/test/resources/.

Bagaimana saya bisa membaca file itu menjadi yang baru FileReaderdalam pengujian saya data.scaladi src/test/scala/?

Aaron Yodaiken
sumber

Jawaban:

204

Sumber daya dimaksudkan untuk diakses menggunakan getResourcemetode gaya khusus yang disediakan Java. Mengingat contoh Anda data.xmlberada di $SBT_PROJECT_HOME/src/test/resources/, Anda dapat mengaksesnya dalam tes seperti ini:

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

Tentu saja itu sourcesekarang hanyalah objek Scala IO biasa sehingga Anda dapat melakukan apa pun yang Anda inginkan, seperti membaca konten dan menggunakannya untuk data pengujian.

Ada metode lain untuk mendapatkan sumber daya juga (misalnya sebagai aliran). Untuk informasi selengkapnya, lihat getResourcemetode di Java Docs: Class .

Mitchell
sumber
8
Saya harus menambahkan getClassLoaderinstruksi. Hasilnya adalahSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius
1
getClassLoaderDiperlukan komentar Moebius yang dikonfirmasi . Tanpanya, jalur menyertakan direktori hierarki kelas dari kelas pengujian. Sesuatu seperti ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. Menggunakan getClass.getClassLoader.getResource()porsi com/mycompany/myapp/module1/utils/blabla/dihilangkan
Polymerase
30

Alternatif lain (terutama jika Anda perlu mengakses sumber daya sebagai a File); adalah mendapatkan jalurnya melalui:

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

Seperti yang telah ditunjukkan di Scala, dapatkan jalur file dari file di folder sumber daya

Neil
sumber
24

sbt menyalin file dari src/test/resourceske target/scala-[scalaVersion]/test-classes.

Anda dapat mengakses sumber daya dalam pengujian Anda sebagai berikut:

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

Itu berasumsi bahwa testData.txtitu langsung di bawah folder src/test/resources. Tambahkan subdirektori mana pun, jika tidak.

Nick A Miller
sumber
0

Dan dalam kasus di mana getClass.getResourcetidak berfungsi (tidak tahu atau peduli kapan atau mengapa tepatnya), com.google.common.io.Resources.getResourcedari Google Guava biasanya bisa

testCompile "com.google.guava:guava:18.0"
oseiskar.dll
sumber
-4

Untuk mengetahui di mana Anda berada dalam sistem file selama pengujian, Anda dapat melakukan hal seperti ini dalam pengujian dummy:

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

Kemudian, saat Anda mengetahui jalur Anda, dalam pengujian Anda, Anda dapat menggunakannya sebagai:

new File("./src/test/resources/yourfile.xml")
heralight
sumber
File di bawah src/test/resourcesberada dalam CLASSPATH pengujian sehingga pengujian dapat mengaksesnya tanpa kode mengetahui struktur direktori build.
Jacek Laskowski
2
Ini mungkin berguna meskipun, jika seseorang perlu menghitung sumber daya (yaitu kode tidak memiliki nama tetap, tetapi akan menggunakan file apapun yang ditempatkan di bawah sana).
akauppi
@akauppi ini dapat dilakukan dengan docs.spring.io/spring-framework/docs/2.5.x/api/org/…
dk14
ini akan membuat Anda mendapat masalah saat Anda menerapkan aplikasi Anda sebagai botol besar
Alex Monras