Mockito与方法参数any()类型

时间:2017-11-06 00:45:46

标签: java mockito

我正在使用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)

它出了什么问题?

1 个答案:

答案 0 :(得分:1)

any(...) - source中没有类型检查:

  

此方法不进行任何类型检查,只是为了避免在代码中进行转换。但是,这可能会在未来的主要版本中发生变化(可以添加类型检查)。

快速浏览源代码,向我们显示任何类型参数的匹配成功,而class参数仅用于生成默认返回值。

public static <T> T any(Class<T> clazz) {
    return (T) reportMatcher(Any.ANY).returnFor(clazz);
}

它也可能使方法重载具有相同数量的参数hard(er)来测试。 使用argThat匹配器进行显式instanceof检查可以避免这种情况。