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 становятся Object при передаче в someClass, и что Mockito неправильно вводит проверку типа Object на соответствие типам ArgumentCaptors?
Я ожидал, что дженерики будут гарантировать, что 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.
Если вы хотите реализовать некоторую дифференциацию аргументов, вы можете попробовать воспользоваться Отвечать
Кажется, этот вопрос уже рассмотрен в теле этого вопроса> stackoverflow.com/questions/17204453/…