Scala'daki test kaynaklarına nasıl erişilir?


137

İçinde bir dosya data.xmlvar src/test/resources/.

Nasıl yeni içine bu dosyayı okuyabilir FileReaderbenim testinde data.scalade src/test/scala/?

Yanıtlar:


202

Kaynaklara getResourceJava'nın sağladığı özel stil yöntemleri kullanılarak erişilmesi amaçlanmıştır . Sizin örneğe göre data.xmlolmak $SBT_PROJECT_HOME/src/test/resources/, bunu böyle bir testte erişebilirsiniz:

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

Tabii ki bu sourceartık sadece normal bir Scala IO nesnesi, böylece içeriği okumak ve test verileri için kullanmak gibi istediğiniz her şeyi yapabilirsiniz.

Kaynağı almanın başka yöntemleri de vardır (örneğin bir akış olarak). Daha fazla bilgi getResourceiçin Java Docs: Class'taki yöntemlere bakın .


8
Talimata bir eklemek zorunda kaldım getClassLoader. SonuçSource.fromURL(getClass.getClassLoader.getResource("simulation.json"))
Moebius

1
Onaylanmış Moebius yorumu getClassLoadergerekiyor. Bu olmadan yol, test sınıfının sınıf hiyerarşi dizinini içerir. Gibi bir şey ~/lighthouse/target/scala-2.12/test-classes/com/mycompany/myapp/module1/utils/blabla/. Kullanma getClass.getClassLoader.getResource()kısmı com/mycompany/myapp/module1/utils/blabla/çıkarılır
Polimeraz


24

sbt, src/test/resourcesile arasındaki dosyaları kopyalar target/scala-[scalaVersion]/test-classes.

Testlerinizdeki kaynaklara aşağıdaki gibi erişebilirsiniz:

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

testData.txtDoğrudan klasörün altında olduğunu varsayar src/test/resources. Aksi takdirde alt dizinleri ekleyin.


0

Google Guava'dan getClass.getResourceçalışmayan durumlarda (ne zaman veya neden tam olarak ne zaman ve neden umursamadığınızı bilmiyorsanız) com.google.common.io.Resources.getResourcegenellikle

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

-4

Test sırasında dosya sisteminde nerede olduğunuzu bilmek için, sahte bir testte böyle bir şey yapabilirsiniz:

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

Ardından, yolunuzu bildiğinizde, testinizde şu şekilde kullanabilirsiniz:

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

Altındaki dosyalar src/test/resourcestestin CLASSPATH'ındadır, böylece testler kod derleme dizini yapısından haberdar olmadan ona erişebilir.
Jacek Laskowski

2
Ancak, kaynakların numaralandırılması gerekiyorsa (yani kodun adları sabit değilse, ancak altına yerleştirilmiş dosyaları kullanacaktır) bu yararlı olabilir.
akauppi


uygulamanızı bir yağ kavanozu olarak dağıttığınızda sorun
çıkarır
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.