Asumsikan saya ingin menguji unit metode dengan tanda tangan ini:
List<MyItem> getMyItems();
Diasumsikan MyItem
sebagai Pojo yang memiliki banyak properti, salah satunya "name"
diakses melalui getName()
.
Yang saya pedulikan untuk memverifikasi adalah bahwa List<MyItem>
, atau apapun Iterable
, berisi dua MyItem
contoh, yang "name"
propertinya memiliki nilai "foo"
dan "bar"
. Jika ada properti lain yang tidak cocok, saya tidak terlalu peduli dengan tujuan pengujian ini. Jika namanya cocok, itu tes yang berhasil.
Saya ingin ini menjadi satu baris jika memungkinkan. Berikut adalah beberapa "sintaksis semu" dari hal yang ingin saya lakukan.
assert(listEntriesMatchInAnyOrder(myClass.getMyItems(), property("name"), new String[]{"foo", "bar"});
Apakah Hamcrest bagus untuk hal semacam ini? Jika demikian, apa sebenarnya versi hamcrest dari sintaks semu saya di atas?
sumber
Ini bukan Hamcrest, tapi saya rasa perlu disebutkan di sini. Yang sering saya gunakan di Java8 adalah seperti:
(Diedit untuk sedikit perbaikan Rodrigo Manyari. Sedikit kurang bertele-tele. Lihat komentar.)
Ini mungkin sedikit lebih sulit untuk dibaca, tapi saya suka jenis dan keamanan refactoring. Ini juga keren untuk menguji beberapa properti kacang dalam kombinasi. misalnya dengan ekspresi && seperti java di filter lambda.
sumber
Assertj pandai dalam hal ini.
Nilai tambah yang besar untuk assertj dibandingkan dengan hamcrest adalah penggunaan penyelesaian kode yang mudah.
sumber
AssertJ menyediakan fitur yang sangat baik dalam
extracting()
: Anda dapat memberikanFunction
s untuk mengekstrak bidang. Ini memberikan cek pada waktu kompilasi.Anda juga bisa menegaskan ukurannya terlebih dahulu dengan mudah.
Itu akan memberi:
containsExactlyInAnyOrder()
menegaskan bahwa daftar hanya berisi nilai-nilai ini apa pun urutannya.Untuk menegaskan bahwa daftar berisi nilai-nilai ini apa pun urutannya tetapi mungkin juga berisi nilai-nilai lain gunakan
contains()
:Sebagai catatan tambahan: untuk menegaskan beberapa bidang dari elemen a
List
, dengan AssertJ kami melakukannya dengan membungkus nilai yang diharapkan untuk setiap elemen ke dalamtuple()
fungsi:sumber
Selama List Anda adalah kelas konkret, Anda cukup memanggil metode contains () selama Anda telah mengimplementasikan metode equals () pada MyItem.
Mengasumsikan Anda telah menerapkan konstruktor yang menerima nilai yang ingin Anda tegaskan. Saya menyadari ini tidak dalam satu baris, tetapi berguna untuk mengetahui nilai mana yang hilang daripada memeriksa keduanya sekaligus.
sumber
AssertJ 3.9.1 mendukung penggunaan predikat langsung dalam
anyMatch
metode.Ini umumnya kasus penggunaan yang sesuai untuk kondisi kompleks sewenang-wenang.
Untuk kondisi sederhana, saya lebih suka menggunakan
extracting
metode (lihat di atas) karena hasil iterable-under-test mungkin mendukung verifikasi nilai dengan keterbacaan yang lebih baik. Contoh: dapat menyediakan API khusus seperticontains
metode dalam jawaban Frank Neblung. Atau Anda dapat memanggilnyaanyMatch
nanti dan menggunakan referensi metode seperti"searchedvalue"::equals
. Juga beberapa ekstraktor dapat dimasukkan ke dalamextracting
metode, hasilnya kemudian diverifikasi menggunakantuple()
.sumber