还有两种方法(请参阅我对@Tomasz Nurkiewicz 上一个答案的评论):
第一个依赖于编译器根本不会让您传入错误类型的事实:
when(a.method(any(Class.class))).thenReturn(b);
您丢失了确切的输入(Class<? extends A>
),但它可能会按照您的需要工作。
第二个涉及更多,但如果您真的想确定 to 的参数method()
是 的一个A
或一个子类,则可以说是一个更好的解决方案A
:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
其中ClassOrSubclassMatcher
anorg.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()
实际返回的内容:-)