Mockito匹配任何类的参数
有没有办法来匹配下面的例程的任何类参数?
class A { public B method(Class<? extends A> a) {} }  我怎么总是返回一个new B()而不pipe哪个类被传入method ? 以下尝试仅适用于A匹配的特定情况。 
 A a = new A(); B b = new B(); when(a.method(eq(A.class))).thenReturn(b); 
编辑 :一个解决scheme是
 (Class<?>) any(Class.class) 
	
还有两种方法可以做到这一点(请参阅我之前对@Tomasz Nurkiewicz的回答的评论):
第一个依赖于编译器根本不会让你传入错误types的事实:
 when(a.method(any(Class.class))).thenReturn(b); 
 你失去了确切的input( Class<? extends A> ),但它可能在你需要的时候工作。 
 第二个是更多的参与,但是如果你真的想确定method()的参数是A或者一个子类,那么可以说是一个更好的解决scheme: 
 when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b); 
 其中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()实际上返回:-) 
还有另外一种方法可以做到,
 when(a.method(Matchers.<Class<A>>any())).thenReturn(b); 
 此解决scheme强制方法any()返回Class<A>types,而不是其默认值( Object )。 
如果你不知道你需要导入哪个软件包:
 import static org.mockito.Matchers.any; any(SomeClass.class) 
要么
 import org.mockito.Matchers; Matchers.any(SomeClass.class) 
怎么样:
 when(a.method(isA(A.class))).thenReturn(b); 
要么:
 when(a.method((A)notNull())).thenReturn(b); 
来自millhouse的解决scheme不再适用于最近的mockito版本
这个解决scheme使用java 8和mockito 2.2.9
  ArgumentMatcher是org.mockito.ArgumentMatcher一个实例 
 public class ClassOrSubclassMatcher<T> implements ArgumentMatcher<Class<T>> { private final Class<T> targetClass; public ClassOrSubclassMatcher(Class<T> targetClass) { this.targetClass = targetClass; } @Override public boolean matches(Class<T> obj) { if (obj != null) { if (obj instanceof Class) { return targetClass.isAssignableFrom( obj); } } return false; } } 
和使用
 when(a.method(ArgumentMatchers.argThat(new ClassOrSubclassMatcher<>(A.class)))).thenReturn(b);