Bunu yapmanın iki yolu daha (@Tomasz Nurkiewicz tarafından verilen önceki yanıt hakkındaki yorumuma bakın):
Birincisi, derleyicinin yanlış türde bir şeyden geçmenize izin vermemesine dayanır:
when(a.method(any(Class.class))).thenReturn(b);
Tam yazmayı (the Class<? extends A>
) kaybedersiniz, ancak muhtemelen ihtiyacınız olduğu gibi çalışır.
İkinci çok daha fazla yer ama eğer tartışmalı daha iyi bir çözüm gerçekten emin argüman o olmak istiyorum method()
bir olan A
veya bir alt ait A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
Nerede ClassOrSubclassMatcher
şu şekilde org.hamcrest.BaseMatcher
tanımlanır:
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");
}
}
Uf! Gerçekten ne method()
döner üzerinde daha ince kontrol almak gerekir kadar ilk seçenek ile gitmek istiyorum :-)
Class<?>
inanılmaz!