Mockito 匹配任何类参数

2022-08-31 06:29:46

有没有办法匹配以下示例例程的任何类参数?

class A {
     public B method(Class<? extends A> a) {}
}

我怎么能总是返回 a,而不管哪个类被传递到?以下尝试仅适用于匹配的特定情况。new B()methodA

A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);

编辑:一个解决方案是

(Class<?>) any(Class.class)

答案 1

还有两种方法可以做到这一点(参见我对@Tomasz Nurkiewicz之前答案的评论):

第一个依赖于编译器根本不会让你传入错误类型的东西这一事实:

when(a.method(any(Class.class))).thenReturn(b);

您丢失了确切的键入(the ),但它可能会根据需要工作。Class<? extends A>

第二个涉及更多,但如果你真的想确保参数是的一个或子类,可以说是一个更好的解决方案:method()AA

when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);

其中,定义为:ClassOrSubclassMatcherorg.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

还有另一种方法可以在不强制转换的情况下做到这一点:

when(a.method(Matchers.<Class<A>>any())).thenReturn(b);

此解决方案强制该方法返回类型,而不是其默认值 ()。any()Class<A>Object