Pertimbangkan kode ini:
public class DummyClass {
public List<? extends Number> dummyMethod() {
return new ArrayList<Integer>();
}
}
public class DummyClassTest {
public void testMockitoWithGenerics() {
DummyClass dummyClass = Mockito.mock(DummyClass.class);
List<? extends Number> someList = new ArrayList<Integer>();
Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this
}
}
Kompilator mengeluh tentang garis yang mencoba untuk mematikan perilaku dummyMethod()
. Adakah petunjuk tentang bagaimana seseorang tentang metode stubbing yang mengembalikan tipe dengan wild-card yang dibatasi?
java
unit-testing
generics
mockito
bounded-wildcard
Shikhar Mishra
sumber
sumber
Jawaban:
Anda juga dapat menggunakan metode aman non-tipe doReturn untuk tujuan ini,
seperti yang dibahas di grup google Mockito.
Meskipun ini lebih sederhana daripada
thenAnswer
, sekali lagi perhatikan bahwa ini bukan tipe yang aman. Jika Anda khawatir tentang keamanan jenis, jawaban millhouse sudah benar.detil tambahan
Agar lebih jelas, inilah kesalahan kompiler yang diamati,
Saya percaya kompiler telah menetapkan tipe wildcard pertama selama
when
panggilan dan kemudian tidak dapat mengkonfirmasi bahwa tipe wildcard kedua dalamthenReturn
panggilan adalah sama.Sepertinya
thenAnswer
tidak mengalami masalah ini karena ia menerima tipe wildcard saatthenReturn
mengambil tipe non-wildcard, yang harus ditangkap. Dari Mockito's OngoingStubbing ,sumber
Saya berasumsi Anda ingin dapat memuat
someList
dengan beberapa nilai yang diketahui; inilah pendekatan yang digunakanAnswer<T>
bersama-sama dengan metode pembantu templated untuk menjaga semua tipe-aman:sumber
Saya memukul hal yang sama kemarin. Kedua jawaban dari @nondescript1 dan @millhouse membantu saya menemukan solusi. Saya sudah cukup banyak menggunakan kode yang sama dengan @millhouse, kecuali bahwa saya membuatnya sedikit lebih umum, karena kesalahan saya bukan disebabkan oleh
java.util.List
, tetapicom.google.common.base.Optional
. Metode pembantu kecil saya memungkinkan untuk semua jenisT
dan bukan hanyaList<T>
:Dengan metode bantuan ini Anda dapat menulis:
Ini mengkompilasi dengan baik dan melakukan hal yang sama seperti
thenReturn(...)
metode.Apakah ada yang tahu jika kesalahan yang dihasilkan oleh kompiler Java adalah bug kompiler atau jika kode tersebut benar-benar salah?
sumber
Mockito.when(dummyClass.dummyMethod()).thenAnswer(x -> someList)
Saya mengubah komentar fikovnik menjadi jawaban di sini untuk memberikan lebih banyak visibilitas karena saya pikir ini solusi paling elegan menggunakan Java 8+.
The dokumentasi Mockito merekomendasikan menggunakan
doReturn()
(seperti yang disarankan dalam jawaban diterima) hanya sebagai pilihan terakhir.Sebagai gantinya, untuk menghindari kesalahan kompiler yang dijelaskan dalam pertanyaan,
when()
pendekatan Mockito yang direkomendasikan dapat digunakan denganthenAnswer()
dan lambda (alih-alih metode penolong):sumber
Meskipun metode utilitas yang diusulkan oleh Marek Radonsky berfungsi, ada juga opsi lain yang bahkan tidak memerlukan (lamban tampak aneh) ekspresi fikovnik menyarankan:
Seperti yang ditunjukkan oleh jawaban untuk pertanyaan serupa ini, Anda juga dapat menggunakan yang berikut:
sumber