Apakah ada metode bersih mengejek kelas dengan parameter generik? Katakanlah saya harus mengejek suatu kelas Foo<T>
yang harus saya sampaikan ke metode yang mengharapkan a Foo<Bar>
. Saya dapat melakukan hal berikut dengan cukup mudah:
Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
Dengan asumsi getValue()
mengembalikan tipe generik T
. Tapi itu akan memiliki anak kucing ketika saya nanti meneruskannya ke metode yang diharapkan Foo<Bar>
. Apakah casting satu-satunya cara untuk melakukan ini?
Salah satu cara lain untuk mengatasi ini adalah dengan menggunakan
@Mock
anotasi. Tidak berfungsi dalam semua kasus, tetapi terlihat jauh lebih seksi :)Ini sebuah contoh:
The
MockitoJUnitRunner
menginisialisasi bidang dijelaskan dengan@Mock
.sumber
SuppressWarnings
. Peringatan ada karena suatu alasan, lebih baik untuk tidak terbiasa menekannya. Terima kasih!@Mock
daripadamock()
: bidang masih nol selama waktu konstruksi, jadi saya tidak bisa memasukkan dependensi pada waktu itu dan tidak bisa membuat bidang menjadi final. Yang pertama dapat dipecahkan dengan@Before
metode yang tentu saja tidak berotot.Anda selalu dapat membuat kelas menengah / antarmuka yang akan memenuhi tipe generik yang ingin Anda tentukan. Misalnya, jika Foo adalah antarmuka, Anda bisa membuat antarmuka berikut di kelas pengujian Anda.
Dalam situasi di mana Foo adalah kelas non-final , Anda bisa memperpanjang kelas dengan kode berikut dan melakukan hal yang sama:
Kemudian Anda dapat menggunakan salah satu dari contoh di atas dengan kode berikut:
sumber
Foo
antarmuka atau kelas non-final, ini tampaknya menjadi solusi yang cukup elegan. Terima kasih.Buat metode uji utilitas . Berguna khusus jika Anda membutuhkannya lebih dari satu kali.
sumber
static <T> T genericMock(Class<? super T> classToMock) { return (T)mock(classToMock); }
bahkan tidak perlu penindasan tunggal :) Tapi hati-hati,Integer num = genericMock(Number.class)
kompilasi, tetapi melemparClassCastException
. Ini hanya berguna untuk kasus yang paling umumG<P> mock = mock(G.class)
.Saya setuju bahwa seseorang tidak seharusnya menekan peringatan di kelas atau metode karena orang dapat mengabaikan peringatan lainnya, yang secara tidak sengaja ditekan. Tapi IMHO itu benar-benar masuk akal untuk menekan peringatan yang hanya mempengaruhi satu baris kode.
sumber
Ini adalah kasus yang menarik: metode menerima pengumpulan generik dan mengembalikan koleksi generik dari tipe dasar yang sama. Sebagai contoh:
Metode ini dapat diejek dengan kombinasi pencocokan Mockito anyCollectionOf dan Jawabannya.
sumber