Bagaimana saya bisa membuat pernyataan kesetaraan antara daftar dalam kasus uji JUnit ? Kesetaraan harus berada di antara isi daftar.
Sebagai contoh:
List<String> numbers = Arrays.asList("one", "two", "three");
List<String> numbers2 = Arrays.asList("one", "two", "three");
List<String> numbers3 = Arrays.asList("one", "two", "four");
// numbers should be equal to numbers2
//numbers should not be equal to numbers3
java
unit-testing
collections
junit
Kamal
sumber
sumber
assertArrayEquals
saat ini. Gunakan dalam kombinasi denganList#toArray
.assertArrayEquals
mengharuskan Anda untuk mendapatkan array dari daftar Anda. Anda dapat beroperasi secara langsung pada daftar menggunakanassertIterableEquals
assertIterableEquals
tersedia untuk jUnit5 @ThetaSinnerJawaban:
Saya menyadari ini ditanya beberapa tahun yang lalu, mungkin fitur ini belum ada. Tapi sekarang, mudah untuk melakukan ini:
Jika Anda memiliki Junit versi terbaru yang terinstal dengan hamcrest, cukup tambahkan impor ini:
http://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThat(T, org.hamcrest.Matcher)
http://junit.org/junit4/javadoc/latest/org/hamcrest/CoreMatchers.html
http://junit.org/junit4/javadoc/latest/org/hamcrest/core/Is.html
sumber
System.out.println(actual == expected);
akan mengembalikan false, tetapiSystem.out.println(actual.equals(expected));
akan mengembalikan true..equals(..)
bukan==
?Jangan bertransformasi menjadi string dan bandingkan. Ini tidak baik untuk kinerja. Di Junit, di dalam Corematchers, ada korek api untuk ini =>
hasItems
Ini adalah cara terbaik yang saya tahu untuk mengecek elemen dalam daftar.
sumber
Assert.assertEquals(4,yourList.size());
assertThat(yourList.toArray(), arrayContainingInAnyOrder(1,2,3,4,5));
toString()
versi mereka bukanlah cara terbaik.Ini adalah jawaban lama, cocok untuk JUnit 4.3 dan di bawah. Versi modern JUnit mencakup pesan kegagalan yang dapat dibaca yang dapat dibaca di dalam metode assertThat. Pilih jawaban lain untuk pertanyaan ini, jika memungkinkan.
Sebagai catatan, seperti @ Paul disebutkan dalam komentarnya untuk jawaban ini, dua
List
s sama:Lihat JavaDocs dari
List
antarmuka .sumber
assertEquals(Object, Object)
dari JUnit4 / JUnit 5 atauassertThat(actual, is(expected));
dari Hamcrest yang diusulkan dalam jawaban lain hanya akan berfungsi karena keduanyaequals()
dantoString()
ditimpa untuk kelas (dan sangat) dari objek yang dibandingkan.Itu penting karena tes kesetaraan dalam pernyataan bergantung
equals()
dan pesan kegagalan pengujian bergantung padatoString()
objek yang dibandingkan.Untuk kelas bawaan seperti
String
,Integer
dan untuk ... tidak ada masalah karena ini menimpa keduanyaequals()
dantoString()
. Jadi sangat valid untuk menegaskanList<String>
atauList<Integer>
denganassertEquals(Object,Object)
.Dan tentang masalah ini: Anda harus menimpa
equals()
di kelas karena masuk akal dalam hal kesetaraan objek, tidak hanya untuk membuat pernyataan lebih mudah dalam ujian dengan JUnit.Untuk membuat pernyataan lebih mudah, Anda memiliki cara lain.
Sebagai praktik yang baik saya mendukung perpustakaan pernyataan / pencocokan.
Berikut ini adalah solusi AssertJ .
org.assertj.core.api.ListAssert.containsExactly()
adalah apa yang Anda butuhkan: itu memverifikasi bahwa grup yang sebenarnya berisi persis nilai yang diberikan dan tidak ada yang lain, agar seperti yang dinyatakan dalam javadoc.Misalkan
Foo
kelas tempat Anda menambahkan elemen dan di mana Anda bisa mendapatkannya.Tes unit
Foo
yang menyatakan bahwa kedua daftar memiliki konten yang sama dapat terlihat seperti:Poin bagus AssertJ adalah bahwa menyatakan
List
seperti yang diharapkan tidak perlu: itu membuat pernyataan menjadi lebih lurus dan kode lebih mudah dibaca:Tapi perpustakaan Penegasan / pencocokan adalah suatu keharusan karena ini akan sangat jauh.
Misalkan sekarang yang
Foo
tidak menyimpan instanceString
tetapiBar
s.Itu adalah kebutuhan yang sangat umum. Dengan Assert, pernyataan itu masih mudah ditulis. Lebih baik Anda dapat menyatakan bahwa konten daftar sama bahkan jika kelas elemen tidak menimpa
equals()/hashCode()
sementara cara JUnit mengharuskan:sumber
Jika Anda tidak peduli dengan urutan elemen, saya sarankan
ListAssert.assertEquals
di add-junit.Tautan: http://junit-addons.sourceforge.net/
Untuk pengguna malas Maven:
sumber
Anda dapat menggunakan assertEquals di junit.
Jika urutan elemen berbeda maka akan mengembalikan kesalahan.
sumber
jika Anda tidak ingin membangun daftar array, Anda dapat mencoba ini juga
sumber
sumber
Jangan menemukan kembali roda!
Ada perpustakaan Google Code yang melakukan ini untuk Anda: Hamcrest
sumber
Saya tahu sudah ada banyak opsi untuk menyelesaikan masalah ini, tetapi saya lebih suka melakukan yang berikut untuk menegaskan dua daftar di setiap oder :
sumber
assertEquals(expected, result);
bekerja untukku. Karena fungsi ini mendapat dua objek, Anda dapat meneruskan apa saja ke sana.sumber
Saya tidak melakukan ini, semua jawaban di atas memberikan solusi yang tepat untuk membandingkan dua daftar Objek. Sebagian besar pendekatan di atas dapat membantu dalam mengikuti perbandingan perbandingan saja - Perbandingan ukuran - Perbandingan referensi
Tetapi jika kita memiliki daftar objek berukuran sama dan data berbeda pada tingkat objek maka pendekatan perbandingan ini tidak akan membantu.
Saya pikir pendekatan berikut ini akan bekerja dengan sempurna dengan mengesampingkan sama dan metode kode hash pada objek yang ditentukan pengguna.
Saya menggunakan Xstream lib untuk mengesampingkan equals dan hashcode tapi kita bisa mengesampingkan equals dan hashcode oleh won won logika / perbandingan juga.
Ini adalah contoh untuk referensi Anda
Yang paling penting adalah Anda bisa mengabaikan bidang dengan Anotasi (@XStreamOmitField) jika Anda tidak ingin menyertakan bidang apa pun pada pemeriksaan Objek yang sama. Ada banyak Anotasi seperti ini untuk dikonfigurasikan jadi lihat lebih dalam tentang anotasi lib ini.
Saya yakin jawaban ini akan menghemat waktu Anda untuk mengidentifikasi pendekatan yang benar untuk membandingkan dua daftar objek :). Berikan komentar jika Anda melihat ada masalah dalam hal ini.
sumber