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,同时包含instanceA和instanceB。
这是为什么?是因为在运行时,instanceA和instanceB参数在传递给someClass时变成了Object,而Mockito却没有根据ArgumentCaptors的类型正确键入check Object?
我期望泛型将确保listA将包含instanceA,listB将包含instanceB。
答案 0 :(得分:0)
根据javadoc,您所期望的内容不受支持,但可能会更改(2.21.0版本):
请注意,ArgumentCaptor 不进行任何类型检查,它只是 避免在您的代码中强制转换。但是,这可能会改变(类型 可以在未来的主要版本中添加检查。
如果您想对参数进行区分,可以尝试利用Answer