Làm thế nào để truy cập tài nguyên kiểm tra trong Scala?


137

Tôi có một tập tin data.xmltrong src/test/resources/.

Làm thế nào tôi có thể đọc tập tin đó vào một mới FileReadertrong thử nghiệm của tôi data.scalatrong src/test/scala/?

Câu trả lời:


202

Các tài nguyên được truy cập bằng các getResourcephương thức kiểu đặc biệt mà Java cung cấp. Cho ví dụ của bạn về data.xmlviệc tham gia $SBT_PROJECT_HOME/src/test/resources/, bạn có thể truy cập nó trong một bài kiểm tra như vậy:

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

Tất nhiên đó sourcegiờ chỉ là một đối tượng Scala IO bình thường để bạn có thể làm bất cứ điều gì bạn muốn với nó, như đọc nội dung và sử dụng nó cho dữ liệu thử nghiệm.

Có các phương pháp khác để có được tài nguyên là tốt (ví dụ như một luồng). Để biết thêm thông tin, hãy xem các getResourcephương thức trên Tài liệu Java: Class .


8
Tôi đã phải thêm một getClassLoaderhướng dẫn. Kết quả làSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius

1
Xác nhận Moebius bình luận getClassLoaderlà cần thiết. Không có nó, đường dẫn bao gồm thư mục phân cấp lớp của lớp kiểm tra. Một cái gì đó như ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. Sử dụng getClass.getClassLoader.getResource()phần com/mycompany/myapp/module1/utils/blabla/này đã bị xóa
Polymerase


24

sbt sao chép các tập tin từ src/test/resourcesđến target/scala-[scalaVersion]/test-classes.

Bạn có thể truy cập các tài nguyên trong các thử nghiệm của mình như sau:

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

Nó không cho rằng đó testData.txtlà trực tiếp dưới thư mục src/test/resources. Thêm bất kỳ thư mục con, nếu không.


0

Và trong trường hợp getClass.getResourcekhông hoạt động (không biết chính xác khi nào hoặc tại sao chính xác), com.google.common.io.Resources.getResourcetừ Google Guava thường làm

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

-4

Để biết bạn đang ở đâu trong hệ thống tệp trong khi kiểm tra, bạn có thể làm một cái gì đó như thế này trong một thử nghiệm giả:

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

Sau đó, khi bạn biết đường dẫn của mình, trong bài kiểm tra của bạn, bạn có thể sử dụng nó như:

new File("./src/test/resources/yourfile.xml")

Các tệp bên dưới src/test/resourcesnằm trong CLASSPATH của kiểm tra để các kiểm tra có thể truy cập vào tệp mà không cần biết mã cấu trúc thư mục xây dựng.
Jacek Laskowski

2
Điều này có thể hữu ích mặc dù, nếu một người cần liệt kê tài nguyên (tức là mã không có tên của họ được cố định, nhưng sẽ sử dụng bất kỳ tệp nào được đặt bên dưới).
akauppi

@akauppi này có thể được thực hiện với docs.spring.io/spring-framework/docs/2.5.x/api/org/...
dk14

điều này sẽ khiến bạn gặp rắc rối khi bạn triển khai ứng dụng của mình dưới dạng bình béo
Alex Monras
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.