Почему Mockito ArgumentCaptor разрушает дженерики

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.

Кажется, этот вопрос уже рассмотрен в теле этого вопроса> stackoverflow.com/questions/17204453/…

user2450824 20.12.2018 14:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
470
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно 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.

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

Другие вопросы по теме