Mockito: Daftar Pencocokan dengan obat generik

167

Mockito menawarkan:

when(mock.process(Matchers.any(List.class)));

Bagaimana cara menghindari peringatan jika processmengambil List<Bar>alih?

Philippe Blayo
sumber

Jawaban:

279

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)));
artbristol
sumber
16
Catatan: ini sudah usang di Mockito 2. * dan akan dihapus di Mockito 3. Sudah usang karena kompiler Java 8 dapat menyimpulkan jenisnya sekarang.
Kip
@artbristol apakah Anda tahu jika dengan anySet () harus berfungsi sama seperti anyList ()? Saya di Java 8 dan peringatan dilemparkan di Eclipse IDE
Fernando Fradegrada
1
Lebih baik digunakan anyListOf. Meskipun anyListberfungsi, itu memancarkan peringatan.
balki
3
anyListOfsudah 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 ArgumentMatchersdengan generik:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
edufinn
14

Selain di anyListOfatas, 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 instanceofFoo", 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.Matchersseperti di atas.

Jeff Bowman
sumber
4
Matchers.any()sangat nyaman!
MB setiap
Pencocokan sekarang sudah tidak digunakan lagi, inilah info dari mockito "Gunakan ArgumentMatchers. Kelas ini sekarang sudah tidak digunakan lagi untuk menghindari bentrokan nama dengan kelas Hamcrest org.hamcrest.Matchers. Kelas ini kemungkinan akan dihapus dalam versi 3.0." static.javadoc.io/org.mockito/mockito-core/2.7.21/org/mockito/…
oddmeter
@oddmeter Perubahan dibuat.
Jeff Bowman
5

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());
Miguel R. Santaella
sumber