为什么Mockito ArgumentCaptor会颠覆泛型

时间:2018-12-20 12:12:38

标签: java unit-testing generics mockito

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。

1 个答案:

答案 0 :(得分:0)

根据javadoc,您所期望的内容不受支持,但可能会更改(2.21.0版本):

  

请注意,ArgumentCaptor 不进行任何类型检查,它只是   避免在您的代码中强制转换。但是,这可能会改变(类型   可以在未来的主要版本中添加检查。

如果您想对参数进行区分,可以尝试利用Answer