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:
when(a.method(any(Class.class))).thenReturn(b);
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()
adalah A
atau subkelas dari A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
Dimana ClassOrSubclassMatcher
merupakan org.hamcrest.BaseMatcher
didefinisikan sebagai:
public class ClassOrSubclassMatcher<T> extends BaseMatcher<Class<T>> {
private final Class<T> targetClass;
public ClassOrSubclassMatcher(Class<T> targetClass) {
this.targetClass = targetClass;
}
@SuppressWarnings("unchecked")
public boolean matches(Object obj) {
if (obj != null) {
if (obj instanceof Class) {
return targetClass.isAssignableFrom((Class<T>) obj);
}
}
return false;
}
public void describeTo(Description desc) {
desc.appendText("Matches a class or subclass");
}
}
Fiuh! Saya akan menggunakan opsi pertama sampai Anda benar - benar perlu mendapatkan kontrol yang lebih baik atas apa yang method()
sebenarnya dikembalikan :-)
Class<?>
luar biasa!