Saya memiliki panggilan metode yang ingin saya tiru dengan mockito. Untuk mulai dengan, saya telah membuat dan menyuntikkan instance objek di mana metode akan dipanggil. Tujuan saya adalah memverifikasi salah satu objek dalam pemanggilan metode.
Apakah ada cara yang memungkinkan mockito Anda untuk menegaskan atau memverifikasi objek dan atributnya ketika metode mock dipanggil?
contoh
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
Alih-alih melakukan anyObject()
saya ingin memeriksa bahwa objek argumen berisi beberapa bidang tertentu
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
Jawaban:
Fitur baru yang ditambahkan ke Mockito menjadikan ini lebih mudah,
Lihatlah dokumentasi Mockito
Jika ada lebih dari satu parameter, dan hanya menangkap satu parameter yang diinginkan, gunakan ArgumentMatchers lain untuk membungkus seluruh argumen:
sumber
Saya pikir cara termudah untuk memverifikasi objek argumen adalah dengan menggunakan
refEq
metode ini:Itu dapat digunakan bahkan jika objek tidak mengimplementasikan
equals()
, karena refleksi digunakan. Jika Anda tidak ingin membandingkan beberapa bidang, cukup tambahkan namanya sebagai argumen untukrefEq
.sumber
Satu lagi kemungkinan, jika Anda tidak ingin menggunakan
ArgumentCaptor
(misalnya, karena Anda juga menggunakan stubbing), adalah menggunakan Pencocokan Hamcrest bersama dengan Mockito.sumber
Matchers
paketnya benar, karena menulis baris kode yang sama denganorg.mockito.Matchers
kelas melemparkan pengecualian yang menyesatkan yang menyatakan bahwa parameter fungsi mock tidak cocok.MockitoHamcrest.argThat()
dan tidakMockito.argThat()
Ini adalah jawaban berdasarkan jawaban dari iraSenthil tetapi dengan anotasi ( Penculik ). Menurut saya itu memiliki beberapa keunggulan:
Contoh:
sumber
captor.getAllValues()
. Metodecaptor.getValue()
yang digunakan dalam jawaban memberikan hasil terakhir.Jika Anda menggunakan Java 8, Anda dapat menggunakan ekspresi Lambda untuk mencocokkan.
Contoh panggilan
Info lebih lanjut: http://source.coveo.com/2014/10/01/java8-mockito/
sumber
Solusi di atas tidak benar-benar berfungsi dalam kasus saya. Saya tidak bisa menggunakan ArgumentCaptor karena metode ini dipanggil beberapa kali dan saya perlu memvalidasi masing-masing. Pencocokan sederhana dengan "argThat" melakukan trik dengan mudah.
Pencocokan Kustom
Test Runner
sumber
Dan solusi yang sangat bagus dan bersih di koltin dari
com.nhaarman.mockito_kotlin
sumber
Anda dapat merujuk yang berikut ini:
Ini akan memverifikasi apakah metode mockedObject dipanggil dengan parameter yang diinginkan.
sumber
Cara mudah lain untuk melakukannya:
sumber
Javadoc untuk refEq menyebutkan bahwa pemeriksaan kesetaraan adalah dangkal! Anda dapat menemukan detail lebih lanjut di tautan di bawah ini:
[ https://static.javadoc.io/org.mockito/mockito-core/2.2.29/org/mockito/ArgumentMatchers.html#refEq(T,%20java.lang.String ...))11]
Masalah "shallow equality" tidak dapat dikontrol ketika Anda menggunakan kelas lain yang tidak menerapkan metode .equals (), kelas "DefaultMongoTypeMapper" adalah contoh di mana metode .equals () tidak diterapkan.
org.springframework.beans.factory.support menawarkan metode yang dapat menghasilkan definisi kacang alih-alih membuat turunan objek, dan dapat digunakan untuk menghilangkan Kegagalan Perbandingan.
** "Definisi bean hanya merupakan deskripsi dari bean, bukan bean itu sendiri. Deskripsi bean mengimplementasikan dengan benar equals () dan hashCode (), jadi daripada membuat DefaultMongoTypeMapper baru (), kami memberikan definisi yang memberitahu bagaimana itu muncul. harus membuat satu "
Dalam contoh Anda, Anda dapat melakukan sesuatu seperti ini
sumber
Solusi yang disederhanakan, tanpa membuat kelas implementasi Matcher baru dan menggunakan ekspresi lambda:
sumber