Hai cách khác để làm điều đó (xem nhận xét của tôi về câu trả lời trước của @Tomasz Nurkiewicz):
Cái đầu tiên dựa trên thực tế là trình biên dịch đơn giản sẽ không cho phép bạn vượt qua thứ gì đó không đúng loại:
when(a.method(any(Class.class))).thenReturn(b);
Bạn mất gõ chính xác ( Class<? extends A>
nhưng) nhưng nó có thể hoạt động như bạn cần.
Thứ hai là tham gia nhiều hơn nhưng được cho là một giải pháp tốt hơn nếu bạn thực sự muốn chắc chắn rằng đối số method()
là một A
hoặc một lớp con của A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
Trường hợp ClassOrSubclassMatcher
được org.hamcrest.BaseMatcher
định nghĩa là:
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");
}
}
Phù! Tôi sẽ đi với tùy chọn đầu tiên cho đến khi bạn thực sự cần kiểm soát tốt hơn những gì method()
thực sự trả về :-)
Class<?>
kinh ngạc!