В документации Mockito и Javadocs говорится
Рекомендуется использовать ArgumentCaptor с проверкой, но не с заглушкой.
но я не понимаю, как ArgumentCaptor может быть использован для заглушки. Может кто-нибудь объяснить вышеприведенное утверждение и показать, как ArgumentCaptor может использоваться для создания заглушек, или предоставить ссылку, показывающую, как это можно сделать?
java
unit-testing
junit
mockito
Не могу сказать
источник
источник
Ответы:
Предполагая следующий метод для тестирования:
Документация Mockito говорит, что вы не должны использовать captor таким образом:
Потому что вы можете просто использовать matcher во время заглушки:
Но проверка - это другая история. Если ваш тест должен гарантировать, что этот метод был вызван с определенным аргументом, используйте,
ArgumentCaptor
и это тот случай, для которого он предназначен:источник
false
не такtrue
.Линия
будет делать так же, как
Таким образом, использование argumentsCaptor.capture (), когда заглушка не имеет добавленной стоимости. Использование Matchers.any () лучше показывает, что происходит на самом деле, и, следовательно, лучше для удобства чтения. С параметром argumentsCaptor.capture () вы не можете прочитать, какие аргументы действительно совпадают. И вместо использования any (), вы можете использовать более конкретные сопоставления, когда у вас есть больше информации (класс ожидаемого аргумента), чтобы улучшить ваш тест.
И еще одна проблема: если при аргументе при использовании аргумента использовать аргументapCaptor.capture () становится неясно, сколько значений следует ожидать после проверки. Мы хотим получить значение во время проверки, а не во время создания заглушки, потому что в этот момент еще нет значения для захвата. Так что же захватчики аргументов захватывают при захвате метода? или это ничего не захватывает? У меня нет ответа на этот вопрос. Я считаю, что это неопределенное поведение, и я не хочу использовать неопределенное поведение.
источник
Гипотетически, если поиск натолкнул вас на этот вопрос, то вы, вероятно, хотите это:
Зачем? Потому что, как и я, ты ценишь время и не собираешься реализовывать
.equals
его ради сценария единого теста.И 99% тестов разваливаются с нулем, возвращенным из Mock, и при разумном дизайне вы сможете избежать возврата
null
любой ценой, использоватьOptional
или переходить в Kotlin. Это подразумевает, чтоverify
не нужно использовать это часто, и ArgumentCaptors просто слишком утомительны для написания.источник