จะเข้าถึงแหล่งข้อมูลทดสอบใน 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 เอกสาร: คลาส


8
ฉันต้องเพิ่มgetClassLoaderคำสั่ง ผลลัพธ์คือSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius

1
getClassLoaderต้องการความคิดเห็น Moebius ที่ยืนยันแล้ว ถ้าไม่มีพา ธ จะมีไดเร็กทอรีลำดับชั้นของคลาสทดสอบ ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/สิ่งที่ชอบ การใช้getClass.getClassLoader.getResource()ส่วนที่com/mycompany/myapp/module1/utils/blabla/ถูกลบออก
Polymerase

28

ทางเลือกอื่น (โดยเฉพาะถ้าคุณต้องการเข้าถึงทรัพยากรในแบบ a File); คือการได้รับมันเส้นทางผ่าน:

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

ตามที่ได้รับการชี้ให้เห็นในScala รับเส้นทางไฟล์ของไฟล์ในโฟลเดอร์ทรัพยากร


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 ของการทดสอบเพื่อให้การทดสอบสามารถเข้าถึงได้โดยไม่ต้องใช้รหัสที่ทราบถึงโครงสร้างไดเรกทอรีการสร้าง
Jacek Laskowski

2
สิ่งนี้อาจมีประโยชน์แม้ว่าหากจำเป็นต้องระบุทรัพยากร (เช่นรหัสไม่ได้แก้ไขชื่อ แต่จะใช้ไฟล์ใด ๆ ที่วางไว้ข้างใต้)
akauppi

@akauppi สามารถทำได้ด้วยdocs.spring.io/spring-framework/docs/2.5.x/api/org/…
dk14

สิ่งนี้จะทำให้คุณมีปัญหาเมื่อคุณปรับใช้แอปของคุณเป็นโถไขมัน
Alex Monras
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.