apakah mungkin untuk melewatkan jenis antarmuka dengan obat generik?
Antarmuka:
public interface AsyncCallback<T>
Dalam metode pengujian saya:
Mockito.any(AsyncCallback.class)
Menempatkan di <ResponseX>
belakang atau untuk .class
tidak berhasil.
(Matchers.<AsyncCallback<ResponseX>>any()
Matchers
sebenarnya sudah usang, tetapiArgumentMatchers
berhasil.Menggunakan Java 8, Anda cukup menggunakan
any()
(dengan asumsi impor statis) tanpa parameter argumen atau tipe karena inferensi tipe yang ditingkatkan. Kompiler sekarang tahu dari tipe target (tipe argumen metode) yang sebenarnya Anda maksudMatchers.<AsyncCallback<ResponseX>>any()
, yang merupakan solusi pra-Java 8.sumber
any()
cocokAsyncCallback<AnyOtherType>
juga?AsyncCallback<AnyOtherType>
bahkan tidak harus mengkompilasi jika tipe argumen adalah 'AsyncCallback <ResponseX>'.when(x.y(any())).thenAnswer(...)
misalnya, di manay
adalahpublic <T> T y(AsyncCallback<T> arg)
. Mungkin akan lebih baik untuk memeriksa jenis jawaban, jika itu yang dibutuhkan?isA()
. Jika objek memegangClass
objek yang sesuai dengan jenisnya, dan antarmuka mengekspos ini, saya kira Anda bisa memeriksanya di pencocokan kustom. Atau misalnya dalam kasusCollection
Anda dapat memeriksa jenis elemen.Matchers
digantikan olehArgumentMatchers
di Mockito v2Saya harus mengadopsi mekanisme berikut untuk memungkinkan obat generik:
Semoga ini bisa membantu seseorang.
sumber
Posting komentar pierrefevrier sebagai jawaban yang mungkin berguna jika ada dalam jawaban, bukan komentar.
Dengan versi baru Mockito:
(Matchers.<AsyncCallback<ResponseX>>any()
sumber
Lebih jauh ke jawaban thSoft menempatkan panggilan yang memenuhi syarat ke () dalam metode berarti saya bisa menghapus kualifikasi karena jenis pengembalian inferensi diperbolehkan:
sumber
Anda bisa melemparkannya, menambahkan peringatan penekan jika Anda suka:
Jika Java memperbolehkan generik 'generik' mereka dapat memiliki metode seperti ini yang Anda cari
sumber
You cannot use argument matchers outside of verification or stubbing.
@SuppressWarnings
: pra-java 8, jika Anda akan menetapkannya ke variabel yang terpisah, Anda bisa menggunakannyaany()
seperti pada jawaban theINtoy. Sekarang dengan java 8,any()
dapat digunakan inline tanpa perlu tugas yang terpisah.Saya punya masalah serupa menggunakan Spring
Example
:Di sini, Anda harus menggunakan kualifikasi, b / c metode findAll dapat mengambil beberapa jenis, seperti
Sort
danIterable
. Anda juga dapat menggunakanMockito.any(Example.class)
tentu saja dengan jenis peringatan keselamatan.sumber