Saya sudah mencoba untuk mengejek metode dengan parameter vararg menggunakan Mockito:
interface A {
B b(int x, int y, C... c);
}
A a = mock(A.class);
B b = mock(B.class);
when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));
Ini tidak berfungsi, namun jika saya melakukan ini sebagai gantinya:
when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));
Ini berhasil, meskipun begitu saya telah sepenuhnya menghilangkan argumen varargs ketika mematikan metode.
Ada petunjuk?
java
mocking
variadic-functions
mockito
kualidafial
sumber
sumber
Jawaban:
Mockito 1.8.1 memperkenalkan pencocokan anyargar () :
Lihat juga riwayat untuk ini: https://code.google.com/archive/p/mockito/issues/62
Edit sintaks baru setelah penghentian:
sumber
anyVararg()
memiliki Object sebagai tipe pengembaliannya. Untuk membuatnya kompatibel dengan semua jenis var arg (mis. String ..., Integer ..., dll.), Lakukan casting secara eksplisit. Misalnya, jika sudah,doSomething(Integer number, String ... args)
Anda dapat melakukan kode tiruan / rintisan dengan sesuatu sepertiwhen(mock).doSomething(eq(1), (String) anyVarargs())
. Itu harus mengurus kesalahan kompilasi.Matchers
sekarang tidak digunakan lagi untuk menghindari benturan nama denganorg.hamcrest.Matchers
kelas dan kemungkinan akan dihapus di mockito v3.0. GunakanArgumentMatchers
sebagai gantinya.Fitur yang agak tidak berdokumen: Jika Anda ingin mengembangkan Pencocokan khusus yang cocok dengan argumen vararg, Anda harus menerapkannya
org.mockito.internal.matchers.VarargMatcher
agar dapat berfungsi dengan benar. Ini adalah antarmuka marker kosong, yang tanpanya Mockito tidak akan membandingkan argumen dengan benar saat menggunakan metode dengan varargs menggunakan Matcher Anda.Sebagai contoh:
sumber
Membangun jawaban Eli Levine di sini adalah solusi yang lebih umum:
Maka Anda bisa menggunakannya dengan pencocokan array hamcrest sebagai berikut:
(Jelas impor statis akan membuat ini lebih mudah dibaca.)
sumber
Saya telah menggunakan kode dalam jawaban Peter Westmacott namun dengan Mockito 2.2.15 sekarang Anda dapat melakukan hal berikut:
verify(a).method(100L, arg1, arg2, arg3)
dimana
arg1, arg2, arg3
varargssumber
Membangun jawaban topchef,
Untuk 2.0.31-beta saya harus menggunakan Mockito.anyVararg alih-alih Matchers.anyVararrg:
sumber
Dalam kasus saya, tanda tangan dari metode yang ingin saya tangkap argumennya adalah:
Dalam hal ini Anda harus menggunakan array byte secara eksplisit:
Saya menggunakan versi mockito
1.10.19
sumber
Anda juga dapat mengulang argumen:
misalnya memeriksa tipenya dan melemparkannya secara tepat, menambah daftar atau apa pun.
sumber
Mengadaptasi jawaban dari @topchef,
Per dokumen java untuk Mockito 2.23.4, Mockito.any () "Cocok dengan apa pun, termasuk null dan varargs."
sumber
Anda dapat melakukannya dengan melewati tangkapan ArgumentCaptor dan kemudian mengambil vararg sebagai daftar menggunakan "getAllValues", lihat: https://stackoverflow.com/a/55621731/11342928
sumber