Mockito ArgumentCaptor 似乎颠覆了泛型,如以下伪代码所示。
public Class SomeClass{
public void someMethod(Object msg){
// do whatever
}
}
执行单元测试,并向其中传递 SomeClass 的模拟。以下方法调用是在模拟上进行的。
someClass.someMethod(instanceA)
someClass.someMethod(instanceB) // where A & B are different classes
单元测试然后执行以下操作>
ArgumentCaptor<A> argumentCaptorA = ArgumentCaptor.forClass(A.class);
ArgumentCaptor<B> argumentCaptorB = ArgumentCaptor.forClass(B.class);
Mockito.verify(someClass, times(2)).someMethod(argumentCaptorA.capture());
Mockito.verify(someClass, times(2)).someMethod(argumentCaptorB.capture());
问题来了>
List<A> listA = argumentCaptorA.getAllValues();
List<B> listB = argumentCaptorB.getAllValues();
listA 和 listB 的大小均为 2,包含实例 A 和实例 B。
这是为什么呢?是否因为在运行时,instanceA 和 instanceB 参数在传递给 someClass 时变成了 Object,并且 Mockito 没有根据 ArgumentCaptor 的类型正确类型检查 Object?
我预计泛型将确保 listA 将包含instanceA,listB 将包含instanceB。
根据 javadoc,您期望的内容不受支持,但可能会更改(2.21.0 版本):
Note that an ArgumentCaptor don't do any type checks, it is only there to avoid casting in your code. This might however change (type checks could be added) in a future major release.
如果您想实现一些参数区分,您可以尝试利用 Answer
我是一名优秀的程序员,十分优秀!