Saya mencoba membandingkan 2 daftar:
assertThat(actual.getList(), is(Matchers.containsInAnyOrder(expectedList)));
Tapi ide
java: no suitable method found for assertThat(java.util.List<Agent>,org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>>)
method org.junit.Assert.<T>assertThat(T,org.hamcrest.Matcher<T>) is not applicable
(no instance(s) of type variable(s) T exist so that argument type org.hamcrest.Matcher<java.lang.Iterable<? extends model.Agents>> conforms to formal parameter type org.hamcrest.Matcher<T>)
method org.junit.Assert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<T>) is not applicable
(cannot instantiate from arguments because actual and formal argument lists differ in length)
Bagaimana saya harus menulisnya?
containsInAnyOrder
mensyaratkan bahwa semua elemen ada, sehingga pernyataan pertama akan gagal. LihathasItems
apakah Anda ingin memeriksa bahwa setidaknya elemen tersebut ada.actual.getList()
kebetulan berisi"item1", "item3", "item2"
, tes akan lulus dan mungkin Anda ingin memastikan hanya berisi item yang terdaftar ... Dalam hal ini Anda dapat menggunakanassertThat(actual.getList().size(), equalTo(2));
sebelum containsInAnyOrder, dengan cara ini Anda memastikan kedua daftar memiliki konten yang sama.hasItems
. Pemeriksaan ekstra tidak diperlukan di sini. Lihat komentar untuk Tim di atas, dan juga Bagaimana perbedaan Hamcrest's hasItems, contains and containsInAnyOrder?*expectedList.toTypedArray()
) saat meneruskan array sebagai vararg!Versi lebih pendek dari jawaban @ Joe tanpa parameter yang berlebihan.
sumber
Untuk melengkapi jawaban @ Joe:
Hamcrest memberi Anda tiga metode utama untuk mencocokkan daftar:
contains
Memeriksa kecocokan semua elemen dengan menghitung urutannya, jika daftar memiliki lebih banyak atau lebih sedikit elemen, itu akan gagalcontainsInAnyOrder
Memeriksa kecocokan semua elemen dan tidak masalah urutannya, jika daftar memiliki lebih banyak atau lebih sedikit elemen, akan gagalhasItems
Memeriksa hanya untuk objek yang ditentukan tidak masalah jika daftar memiliki lebih banyakhasItem
Memeriksa hanya satu objek, tidak masalah jika daftarnya memiliki lebih banyakSemuanya dapat menerima daftar objek dan menggunakan
equals
metode untuk perbandingan atau dapat dicampur dengan pencocokan lain seperti @borjab disebutkan:http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#contains (E ...) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html #containsInAnyOrder (java.util.Collection) http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html#hasItems (T ...)
sumber
Dengan pustaka Hamcrest yang ada (mulai v.2.0.0.0) Anda dipaksa untuk menggunakan metode Collection.toArray () pada Koleksi Anda untuk menggunakan containsInAnyOrder Matcher. Jauh lebih baik menambahkan ini sebagai metode terpisah ke org.hamcrest.Matchers:
Sebenarnya saya akhirnya menambahkan metode ini ke pustaka pengujian khusus saya dan menggunakannya untuk meningkatkan keterbacaan kasus pengujian saya (karena lebih sedikit verbositas).
sumber
Pastikan bahwa
Object
s dalam daftar Anda telahequals()
ditentukan pada mereka. Kemudianbekerja.
sumber
Untuk daftar objek Anda mungkin memerlukan sesuatu seperti ini:
Gunakan containsInAnyOrder jika Anda tidak ingin memeriksa urutan objek.
PS Bantuan apa pun untuk menghindari peringatan yang ditekan akan sangat dihargai.
sumber
Untuk membandingkan dua daftar dengan urutan yang diawetkan menggunakan,
sumber
actualList
mengandung elemen di dalamcontains
matcher, yang akan gagal jika elemen tidak dalam urutan yang sama dan akan gagal juga jika mengandung lebih banyak elemen atau hilang satu.