Mockito ArgumentCaptor: как захватить класс и объект

#java #testing #junit #mockito

#java #тестирование #junit #mockito

Вопрос:

Я пытался захватить некоторые типы, и я не могу найти чистое решение. Я получил это:

 @Captor
private ArgumentCaptor<T extends DTO> targetMapperCaptor;
  

Я использую этот Captor против mapper, используя 2 типа параметров; экземпляр или clazz.

Как объявлено, захватываются только те объекты, которые расширяют DTO, для захвата классов:

 @Captor
private ArgumentCaptor<Class> targetMapperCaptor;
  

Приводя пример, используя этот код в реализации:

 mock.map(MyObject.class);
mock.map(new MyObject());
  

И наличие этого в тесте:

 when(mock, times(2)).map(targetMapperCaptor.capture());
  

Всегда будет выдавать TooLittleActualInvocations (хотел 2, но получил 1). Если мы удалим times(2), внутри targetMapperCaptor.getAllValues() останется только значение, соответствующее типу.

Есть какой-либо способ объявить ArgumentCaptor для захвата любого параметра?

Я также безуспешно пытался:

 private ArgumentCaptor<?> targetMapperCaptor;
private ArgumentCaptor targetMapperCaptor;
  

Комментарии:

1. Я бы сказал, что ваш подход с использованием общего captor неверен. Используйте два конкретных captors и убедитесь, что соответствующая map перегрузка была вызвана ровно один раз (не два).

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

3. Большое спасибо @Tom

4. Что вы имеете в виду, говоря «он должен проверить, вызывает ли он метод класса или метод экземпляра». . Что такое «это»? Когда вы имеете в виду свой фреймворк-макет, тогда «да», но это не имеет большого значения. Более важно, чтобы ваши тесты были четкими и понятными. Наличие двух конкретных captors с четкими типами также делает ваш тест более понятным для чтения и понимания.

5. Полностью согласен. Извините, «Это» — это сам тест. Я хотел сказать, что тест является более исчерпывающим, используя способ, который вы предлагаете. Проверка того, что был выполнен один вызов метода класса и один вызов был выполнен для метода экземпляра.