อีกสองวิธีที่จะทำ (ดูความคิดเห็นของฉันในคำตอบก่อนหน้าโดย @Tomasz Nurkiewicz):
สิ่งแรกนั้นขึ้นอยู่กับความจริงที่ว่าคอมไพเลอร์ไม่ยอมให้คุณผ่านสิ่งที่ผิดประเภท:
when(a.method(any(Class.class))).thenReturn(b);
คุณสูญเสียการพิมพ์ที่แน่นอน ( Class<? extends A>
) แต่อาจทำงานได้ตามที่คุณต้องการ
ประการที่สองคือมีส่วนร่วมมากขึ้น แต่เป็น arguably เป็นทางออกที่ดีกว่าถ้าคุณจริงๆต้องการให้แน่ใจว่าอาร์กิวเมนต์ที่จะmethod()
เป็นA
หรือ subclass ของ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<?>
! ที่น่าตื่นตาตื่นใจ