Saya mencoba untuk memasukkan ScalaTest ke dalam proyek Java saya; mengganti semua pengujian JUnit dengan ScalaTests. Pada satu titik, saya ingin memeriksa apakah Injector Guice menyuntikkan tipe yang benar. Di Java, saya punya tes seperti ini:
public class InjectorBehaviour {
@Test
public void shouldInjectCorrectTypes() {
Injector injector = Guice.createInjector(new ModuleImpl());
House house = injector.getInstance(House.class);
assertTrue(house.door() instanceof WoodenDoor);
assertTrue(house.window() instanceof BambooWindow);
assertTrue(house.roof() instanceof SlateRoof);
}
}
Tapi saya punya masalah melakukan hal yang sama dengan ScalaTest:
class InjectorSpec extends Spec {
describe("An injector") {
it("should inject the correct types") {
val injector = Guice.createInjector(new ModuleImpl)
val house = injector.getInstance(classOf[House])
assert(house.door instanceof WoodenDoor)
assert(house.window instanceof BambooWindow)
assert(house.roof instanceof SlateRoof)
}
}
}
Ia mengeluh bahwa nilainya instanceof
bukan anggota Door
/ Window
/ Roof
. Tidak bisakah saya menggunakan instanceof
cara itu di Scala?
isInstanceOf[TraitName]
.Dengan Scalatest 2.2.x (bahkan mungkin lebih awal) Anda dapat menggunakan:
sumber
a[Type]
sehingga Anda dapat secara tata bahasa benar;)tiger shouldBe a [Tiger]
adalah sintaks saat ini scalatest.org/at_a_glance/FlatSpecmustBe
juga benar, jika Anda menggunakan doc.scalatest.org/3.0.1/#org.scalatest.MustMatchers yang Anda inginkan untuk FreeSpec.Jika Anda ingin mengurangi JUnit-esque dan jika Anda ingin menggunakan matcher ScalaTest, Anda dapat menulis matcher properti Anda sendiri yang cocok dengan tipe (penghapusan tipe batang).
Saya menemukan utas ini cukup berguna: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea
Anda kemudian dapat menulis pernyataan seperti:
dari pada
sumber
Jawaban terkini tentang isInstanceOf [Type] dan saran junit bagus, tetapi saya ingin menambahkan satu hal (untuk orang yang membuka halaman ini dalam kapasitas yang tidak terkait dengan junit). Dalam banyak kasus, pencocokan pola skala akan sesuai dengan kebutuhan Anda. Saya akan merekomendasikannya dalam kasus tersebut karena memberi Anda typecasting secara gratis dan menyisakan sedikit ruang untuk kesalahan.
Contoh:
sumber
inside(foo)
`foo match). Lihat scalatest.org/user_guide/using_matchers#matchingAPatternKonsolidasi referensi diskusi ScalaTest Guillaume (dan diskusi lain yang ditautkan oleh James Moore) ke dalam dua metode, diperbarui untuk ScalaTest 2.x dan Scala 2.10 (untuk menggunakan ClassTag daripada manifes):
sumber
Saya menggunakan 2.11.8 untuk melakukan penegasan dengan koleksi. Sintaks yang lebih baru adalah sebagai berikut:
sumber
Map
parameter tipe. Apa yang Anda tulis sama dengan menulisscores shouldBe a[Map[_, _]]
. Ini disebutkan di sini: scalatest.org/user_guide/using_matchers#checkingAnObjectsClass