Apakah mungkin di JUnit untuk menegaskan suatu objek adalah turunan dari kelas? Karena berbagai alasan, saya memiliki objek dalam pengujian yang ingin saya periksa jenisnya. Apakah itu tipe Object1 atau tipe Object2?
Saat ini saya punya:
assertTrue(myObject instanceof Object1);
assertTrue(myObject instanceof Object2);
Ini bekerja tetapi saya bertanya-tanya apakah ada cara yang lebih ekspresif untuk melakukan ini.
Misalnya sesuatu seperti:
assertObjectIsClass(myObject, Object1);
Saya bisa melakukan ini:
assertEquals(myObject.class, Object1.getClass());
Apakah ada metode penegasan khusus yang memungkinkan saya untuk menguji jenis objek dengan cara yang lebih elegan dan lancar?
java
unit-testing
junit
RNJ
sumber
sumber
assertTrue(myObject instanceof Object1);
danassertEquals(myObject.class, Object1.getClass());
sebenarnya tes yang berbeda? Yang pertama menerima myObject menjadi turunan dari subclassObject1
, yang kemudian tidak.assertTrue
.assertTrue
hanya akan mengatakanexpected true got false
, Hamcrest akan mengatakanexpected instanced of XYZ, got instance of ABC
Jawaban:
Anda dapat menggunakan
assertThat
metode dan Pencocokan yang datang dengan JUnit.Lihatlah tautan ini yang menjelaskan sedikit tentang JUnit Matchers.
Contoh:
Uji:
sumber
instanceof
:BaseClass subClass = new SubClass(); assertThat(subClass, isA(SubClass.class));
, tetapi tidak mengkompilasi karenaSubClass
tidak? super BaseClass
.instanceOf(BaseClass.class)
keinstanceOf(String.class)
dan Anda akan melihat bahwa itu mengkompilasi dengan baik tetapi akan ada AssertionError dilemparkan.Class<T>
alih-alihClass<?>
(yang dilakukan oleh instanceOf). Karena ia menangkap kelas, itu akan menjadi kesalahan waktu kompilasi untuk melakukan isA dengan kelas yang tidak kompatibel dengan instance. github.com/hamcrest/JavaHamcrest/issues/39Karena
assertThat
yang dulu jawabannya sudah usang, saya memposting solusi yang benar:assertTrue(objectUnderTest instanceof TargetObject);
sumber
true
benar? Dan saya pikir Anda ingin menguji tipe yang sebenarnya.Solusi untuk JUnit 5
Dokumentasi mengatakan:
Contoh untuk Hamcrest :
Contoh untuk AssertJ :
Perhatikan bahwa ini mengasumsikan Anda ingin menguji perilaku yang mirip dengan
instanceof
(yang menerima subkelas). Jika Anda ingin tipe yang sama persis, saya tidak melihat cara yang lebih baik daripada menyatakan bahwa dua kelas sama dengan yang Anda sebutkan dalam pertanyaan.sumber
assertThat()
ditangguhkan ke Hamcrest, sehingga JUnit juga bekerja dengan perpustakaan pernyataan pihak ketiga.instanceOf
sebagaiinstanceof
(keberatan kasus).instanceOf
adalah fungsi sementarainstanceof
adalah kata kunci Java .Solusi untuk JUnit 5 untuk Kotlin!
Contoh untuk Hamcrest :
Contoh untuk AssertJ :
sumber