有没有办法匹配以下示例例程的任何类参数?
class A { public B method(Class<? extends A> a) {} }
无论传入哪个类,我如何 始终 返回 a ?以下尝试仅适用于匹配的特定情况。new B()``method``A
new B()``method``A
A a = new A(); B b = new B(); when(a.method(eq(A.class))).thenReturn(b);
编辑 :一种解决方案是
(Class<?>) any(Class.class)
还有两种方法(请参阅我对@Tomasz Nurkiewicz 上一个答案的评论):
第一个依赖于编译器根本不会让你传入错误类型的事实:
when(a.method(any(Class.class))).thenReturn(b);
您丢失了确切的输入(Class<? extends A>),但它可能会按照您的需要工作。
Class<? extends A>
第二个涉及更多,但如果您 真的 想确定 to 的参数method()是 的一个A或一个子类,则可以说是一个更好的解决方案A:
method()
A
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
其中ClassOrSubclassMatcheranorg.hamcrest.BaseMatcher定义为:
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()实际返回的内容:-)