Joh*_*erg 142 java arguments class matcher mockito
有没有办法匹配以下示例例程的任何类参数?
class A {
public B method(Class<? extends A> a) {}
}
Run Code Online (Sandbox Code Playgroud)
无论传递哪个类,我怎么能总是返回?以下尝试仅适用于匹配的特定情况.new B()methodA
A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);
Run Code Online (Sandbox Code Playgroud)
编辑:一个解决方案是
(Class<?>) any(Class.class)
Run Code Online (Sandbox Code Playgroud)
mil*_*use 179
还有两种方法(参见我对@Tomasz Nurkiewicz先前回答的评论):
第一个依赖于编译器根本不会让你传入错误类型的事实:
when(a.method(any(Class.class))).thenReturn(b);
Run Code Online (Sandbox Code Playgroud)
你失去了确切的输入(Class<? extends A>),但它可能会按你需要的那样工作.
第二个涉及更多,但可以说是一个更好的解决方案,如果你真的想确定参数method()是一个A或一个子类A:
when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);
Run Code Online (Sandbox Code Playgroud)
当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");
}
}
Run Code Online (Sandbox Code Playgroud)
唷!我会选择第一个选项,直到你真的需要更好地控制method()实际返回的内容:-)
小智 49
没有强制转换还有另一种方法可以做到这一点
when(a.method(Matchers.<Class<A>>any())).thenReturn(b);
Run Code Online (Sandbox Code Playgroud)
此解决方案强制该方法any()返回Class<A>类型而不是其默认值(Object).
小智 37
如果您不知道需要导入哪个包:
import static org.mockito.Matchers.any;
any(SomeClass.class)
Run Code Online (Sandbox Code Playgroud)
要么
import org.mockito.Matchers;
Matchers.any(SomeClass.class)
Run Code Online (Sandbox Code Playgroud)
Tom*_*icz 26
怎么样:
when(a.method(isA(A.class))).thenReturn(b);
Run Code Online (Sandbox Code Playgroud)
要么:
when(a.method((A)notNull())).thenReturn(b);
Run Code Online (Sandbox Code Playgroud)
来自millhouse的解决方案不再适用于最新版本的mockito
此解决方案适用于java 8和mockito 2.2.9
其中ArgumentMatcher是一个instanceoforg.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;
}
}
Run Code Online (Sandbox Code Playgroud)
并使用
when(a.method(ArgumentMatchers.argThat(new ClassOrSubclassMatcher<>(A.class)))).thenReturn(b);
Run Code Online (Sandbox Code Playgroud)