Java memverifikasi panggilan metode void n kali dengan Mockito

146

Saya mencoba memverifikasi bahwa metode (void) dipanggil di dalam DAO - Saya menggunakan titik komit yang mengirimkan daftar hasil ke titik tersebut, menyetel ulang daftar dan melanjutkan. Katakanlah saya memiliki 4 hal dalam daftar dan saya memiliki titik komit 1, saya berharap metode "kirim" dipanggil 4 kali. Saya dapat memverifikasi bahwa metode tersebut dipanggil sekali dengan menulis

Mockito.verify(mock).send()

itu lolos .. tapi saya ingin memverifikasi berapa kali itu dipanggil. Saya akan berpikir begitu

Mockito.verify(mock.send(), times(4))

akan cukup, tetapi dikatakan bahwa parameternya tidak benar untuk verifikasi.

Kebetulan, jika saya berubah Mockito.verify(mock).send()ke Mockito.verify(mock.send())atau Mockito.verify((mock).send())saya mendapatkan kesalahan yang sama. Pendapat tentang ini?

nbpeth.dll
sumber
10
Coba Mockito.verify(mock, times(4)).send(). Saya bertanya-tanya mengapa Anda "memindahkan" send()pemanggilan metode di dalam verifymetode. Anda sudah memiliki sintaks yang benar.
Tom
Juga perhatikan bahwa jika Anda tidak peduli berapa kali sesuatu dipanggil, Anda dapat menulisverify(mock, atLeastOnce()).send();
Dawood ibn Kareem
Terima kasih, benar. Apa yang saya temukan membingungkan adalah bahwa Mockito.verify(mock).send()berlalu tetapi hanya mengenkapsulasi itu menyebabkan kesalahan, yang, tidak mengubah apa pun. Namun, ini adalah kemenangan!
nbpeth

Jawaban:

247

Metode yang diperlukan adalah Mockito # verifikasi :

public static <T> T verify(T mock,
                           VerificationMode mode)

mockadalah objek Anda mengejek dan modeadalah VerificationModeyang menggambarkan bagaimana mock harus diverifikasi. Mode yang memungkinkan adalah :

verify(mock, times(5)).someMethod("was called five times");
verify(mock, never()).someMethod("was never called");
verify(mock, atLeastOnce()).someMethod("was called at least once");
verify(mock, atLeast(2)).someMethod("was called at least twice");
verify(mock, atMost(3)).someMethod("was called at most 3 times");
verify(mock, atLeast(0)).someMethod("was called any number of times"); // useful with captors
verify(mock, only()).someMethod("no other method has been called on the mock");

Anda memerlukan impor statis ini dari Mockitokelas untuk menggunakan verifymetode dan mode verifikasi berikut:

import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

Jadi dalam kasus Anda sintaks yang benar adalah:

Mockito.verify(mock, times(4)).send()

Ini memverifikasi bahwa metode sendtersebut dipanggil 4 kali pada objek yang diolok-olok. Ini akan gagal jika dipanggil kurang atau lebih dari 4 kali.


Jika Anda hanya ingin memeriksa, jika metode tersebut telah dipanggil sekali, maka Anda tidak perlu meneruskan a VerificationMode. Sederhana

verify(mock).someMethod("was called once");

akan cukup. Ini digunakan secara internal verify(mock, times(1)).someMethod("was called once");.


Dimungkinkan untuk memiliki beberapa panggilan verifikasi pada tiruan yang sama untuk mencapai verifikasi "antara". Mockito tidak mendukung hal seperti ini verify(mock, between(4,6)).someMethod("was called between 4 and 6 times");, tetapi kami dapat menulis

verify(mock, atLeast(4)).someMethod("was called at least four times ...");
verify(mock, atMost(6)).someMethod("... and not more than six times");

sebaliknya, untuk mendapatkan perilaku yang sama. Batasannya disertakan , sehingga kasus uji berwarna hijau ketika metode tersebut dipanggil 4, 5 atau 6 kali.

Tom
sumber
1
Bagi siapa pun yang ingin menemukan di mana VerificationModemetode tersebut (untuk impor statis atau referensi eksplisit), metode tersebut berada org.mockito.internal.verification.VerificationModeFactory.
Steve Chambers
verify(mock, atLeast(0)).someMethod("was called any number of times");sangat membantu untuk mengabaikan verifikasi panggilan
tj-reses
2
apakah ada sesuatu seperti verify(between(m,n))yang memverifikasi jumlah panggilan antara m dan n?
nishant
2
@nishant Tidak, Mockito tampaknya tidak mendukung itu, tetapi Anda dapat menelepon verifyke waktu dengan atLeast(M)dan atMost(n)untuk mendapatkan perilaku yang sama. Saya telah mengedit jawaban untuk menjelaskan itu.
Tom
@KevinWelker Anda benar, saya telah menghapus informasi tentang VerificationModeFactory. Ini masih tersedia dalam versi terbaru, tetapi saya setuju bahwa kelas internal tidak boleh digunakan.
Tom