Почему Mockito ArgumentCaptor подрывает генерики - PullRequest
0 голосов
/ 20 декабря 2018

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 и что Mockito неправильно проверяет тип объекта на соответствие типам ArgumentCaptors?

Я ожидал, что дженерики обеспечат, чтобы listA содержал instanceA, а listB содержал instanceB.

1 Ответ

0 голосов
/ 20 декабря 2018

В соответствии с тем, что вы ожидали, javadoc не поддерживается, но может измениться (версия 2.21.0):

Обратите внимание, что ArgumentCaptor не выполняет никаких проверок типов ,это только там, чтобы избежать приведения в вашем коде.Однако это может измениться (проверки типов могут быть добавлены) в будущем основном выпуске.

Если вы хотите реализовать некоторую дифференциацию аргументов, вы можете попробовать воспользоваться Answer

...