इसे करने के दो और तरीके (मेरी टिप्पणी @Tomasz Nurkiewicz द्वारा पिछले उत्तर पर देखें):
पहला इस तथ्य पर निर्भर करता है कि संकलक आपको गलत प्रकार के कुछ में पारित नहीं होने देगा:
when(a.method(any(Class.class))).thenReturn(b);
आप सटीक टाइपिंग खो देते हैं (a) Class<? extends A>
) लेकिन यह संभवत: वैसे ही काम करता है जैसा आपको इसकी आवश्यकता है।
दूसरा एक बहुत अधिक शामिल है, लेकिन यकीनन एक बेहतर समाधान है यदि आप वास्तव में यह सुनिश्चित करना चाहते हैं कि तर्क method()
एक A
या इसके अधीन है A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
कहाँ ClassOrSubclassMatcher
एक है org.hamcrest.BaseMatcher
के रूप में परिभाषित:
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");
}
}
ओह! मैं पहले विकल्प के साथ जाऊँगा जब तक कि आपको वास्तव में बेहतर नियंत्रण प्राप्त करने की आवश्यकता नहीं है कि method()
वास्तव में क्या रिटर्न :-)
Class<?>
गजब का!