我正在使用Mockito 1.10.19来测试方法调用。我有一些类调用execute
方法
public class Argument {
public D execute(B b){
return new D();
}
}
class A extends B {
}
class B {
}
class C extends B {
}
class D {}
测试
public class ArgumentTest {
@Test
public void execute() throws Exception {
Argument argument = mock(Argument.class);
A a = mock(A.class);
D d = mock(D.class);
when(argument.execute(any(A.class))).thenAnswer(
(invocation) -> {
Object[] args = invocation.getArguments();
Object mock = invocation.getMock();
return d;
}
);
argument.execute(new C());
}
}
当我运行此测试时,它匹配when
匹配器,即使参数any(A.class)
。
它出了什么问题?
答案 0 :(得分:1)
any(...)
- source中没有类型检查:
此方法不进行任何类型检查,只是为了避免在代码中进行转换。但是,这可能会在未来的主要版本中发生变化(可以添加类型检查)。
快速浏览源代码,向我们显示任何类型参数的匹配成功,而class参数仅用于生成默认返回值。
public static <T> T any(Class<T> clazz) {
return (T) reportMatcher(Any.ANY).returnFor(clazz);
}
它也可能使方法重载具有相同数量的参数hard(er)来测试。
使用argThat
匹配器进行显式instanceof
检查可以避免这种情况。