Apakah ada cara untuk mencocokkan argumen kelas dari rutin sampel di bawah ini?
class A {
public B method(Class<? extends A> a) {}
}
Bagaimana saya bisa selalu mengembalikan kelas new B()
apa pun yang dilewatkan method
? Upaya berikut ini hanya berfungsi untuk kasus tertentu A
yang cocok.
A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
EDIT : Salah satu solusinya adalah
(Class<?>) any(Class.class)
Class<?>
luar biasa!Jawaban:
Dua cara lain untuk melakukannya (lihat komentar saya pada jawaban sebelumnya oleh @Tomasz Nurkiewicz):
Yang pertama bergantung pada fakta bahwa kompiler tidak akan membiarkan Anda memasukkan sesuatu dengan tipe yang salah:
Anda kehilangan pengetikan yang tepat (the
Class<? extends A>
) tetapi mungkin berhasil sesuai keinginan Anda.Yang kedua jauh lebih terlibat tetapi bisa dibilang solusi yang lebih baik jika Anda benar - benar ingin memastikan bahwa argumen untuk
method()
adalahA
atau subkelas dariA
:Dimana
ClassOrSubclassMatcher
merupakanorg.hamcrest.BaseMatcher
didefinisikan sebagai:Fiuh! Saya akan menggunakan opsi pertama sampai Anda benar - benar perlu mendapatkan kontrol yang lebih baik atas apa yang
method()
sebenarnya dikembalikan :-)sumber
if (obj instanceof Class)
messes segalanya bagi saya, jadi saya dihapus.extends BaseMatcher<Class<T>>
menjadi adilextends BaseMatcher<T>
. Hanya FYI, jika orang lain mendapat kesalahan kompilasi, coba itu.matches
fungsi sebagai berikut:public boolean matches(Object obj) { if (obj != null) { return targetClass.isAssignableFrom(obj.getClass()); } return false; }
Ada cara lain untuk melakukannya tanpa pemain:
Solusi ini memaksa metode
any()
untuk mengembalikanClass<A>
tipe dan bukan nilai standarnya (Object
).sumber
Matchers
tidak lagi digunakan dalam versi Mockito yang lebih baru dan kemungkinan akan dihapus di versi 3.0. GunakanArgumentMatchers
sebagai gantinya:when(a.method(ArgumentMatchers.<Class<A>>any())).thenReturn(b);
Jika Anda tidak tahu Paket mana yang perlu Anda impor:
ATAU
sumber
org.mockito.ArgumentMatchers.any
Bagaimana tentang:
atau:
sumber
method(A a)
- tapi itu (efektif)method(Class<A> a)
- jadi Anda harus menggunakan:when(a.method(isA(Class.class))).thenReturn(b);
atauwhen(a.method((Class<A>) notNull())).thenReturn(b);
solusi dari millhouse tidak berfungsi lagi dengan versi terbaru dari mockito
Solusi ini berfungsi dengan java 8 dan mockito 2.2.9
di mana
ArgumentMatcher
ada instanceoforg.mockito.ArgumentMatcher
Dan penggunaannya
sumber
public static <T> Class<T> subClassOf(Class<T> targetClass) { return argThat(new ClassOrSubclassMatcher<>(targetClass)); }