Mockito menawarkan:
when(mock.process(Matchers.any(List.class)));
Bagaimana cara menghindari peringatan jika process
mengambil List<Bar>
alih?
Mockito menawarkan:
when(mock.process(Matchers.any(List.class)));
Bagaimana cara menghindari peringatan jika process
mengambil List<Bar>
alih?
Jawaban:
Untuk Java 8 dan di atasnya, mudah:
when(mock.process(Matchers.anyList()));
Untuk Java 7 dan di bawahnya, kompiler memerlukan sedikit bantuan. Gunakan anyListOf(Class<T> clazz)
:
when(mock.process(Matchers.anyListOf(Bar.class)));
anyListOf
. Meskipun anyList
berfungsi, itu memancarkan peringatan.
anyListOf
sudah usang, jadi lebih baik untuk tidak menggunakannya. Contoh untuk Java 8 tidak berfungsi jika metode overload, misalnya jika Anda memiliki metode yang menerima 2 daftar berbeda: List<DBEntity>
dan List<DTO>
saya telah memecahkan masalah ini menggunakan ArgumentMatchers
dengan generik:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
Selain di anyListOf
atas, Anda selalu dapat menentukan obat generik secara eksplisit menggunakan sintaks ini:
when(mock.process(Matchers.<List<Bar>>any(List.class)));
Java 8 yang baru memungkinkan inferensi tipe berdasarkan pada parameter, jadi jika Anda menggunakan Java 8, ini bisa berfungsi juga:
when(mock.process(Matchers.any()));
Ingatlah bahwa tidak ada any()
atau tidak anyList()
akan berlaku cek, termasuk ketik atau cek kosong. Dalam Mockito 2.x, any(Foo.class)
diubah menjadi "any instanceof
Foo", tetapi any()
masih berarti "semua nilai termasuk null
".
CATATAN: Di atas telah beralih ke ArgumentMatchers di versi Mockito yang lebih baru, untuk menghindari tabrakan nama dengan org.hamcrest.Matchers
. Versi Mockito yang lebih lama harus tetap digunakan org.mockito.Matchers
seperti di atas.
Matchers.any()
sangat nyaman!
Sebelum Java 8 (versi 7 atau 6) saya menggunakan metode baru ArgumentMatchers.anyList:
import static org.mockito.Mockito.*;
import org.mockito.ArgumentMatchers;
verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());