问题
有没有办法匹配以下示例例程的任何类参数?
class A {
public B method(Class<? extends A> a) {}
}
怎么能I总是返回anew B()
无论哪个类传递到method
?以下尝试仅适用于A
匹配的特定情况。
A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
编辑:一个解决方案是
(Class<?>) any(Class.class)
#1 热门回答(146 赞)
还有两种方法(参见我对@Tomasz Nurkiewicz先前回答的评论):
第一个依赖于编译器根本不会让你传入错误类型的事实:
when(a.method(any(Class.class))).thenReturn(b);
你失去了确切的输入(Class<? extends A>
),但它可能会按你需要的那样工作。
第二个涉及更多,但可以说是一个更好的解决方案,如果你真的想确定method()
的参数是anA
或A
的子类:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
WhereClassOrSubclassMatcher
是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()
实际返回的内容:-)
#2 热门回答(34 赞)
没有强制转换,有另一种方法可以做到这一点
when(a.method(Matchers.<Class<A>>any())).thenReturn(b);
该解决方案迫使方法any()
返回Class<A>
type而不是其默认值(Object
)。
#3 热门回答(23 赞)
如果你不知道需要导入哪个软件包:
import static org.mockito.Matchers.any;
any(SomeClass.class)
要么
import org.mockito.Matchers;
Matchers.any(SomeClass.class)