Mockito - разница между doReturn () и когда ()


198

В настоящее время я нахожусь в процессе использования Mockito для имитации объектов моего сервисного уровня в приложении Spring MVC, в котором я хочу протестировать методы Controller. Однако, как я читал о специфике Mockito, я обнаружил, что методы doReturn(...).when(...)эквивалентны when(...).thenReturn(...). Итак, мой вопрос: какой смысл иметь два метода, которые делают одно и то же, или в чем тонкая разница между doReturn(...).when(...)и when(...).thenReturn(...)?

Любая помощь будет оценена.


1
У Javadoc есть несколько случаев, когда doReturn()это полезно.
Сотириос Делиманолис

5
Я думаю, что одно из основных отличий заключается в том, что doReturn (...). When (..) является более старым и не является безопасным, поэтому мы можем использовать его иногда, когда компилятор продолжает жаловаться на приведение. Когда (..). ThenReturn (..) намного лучше с точки зрения безопасности типов
user2511882

Ответы:


229

Два синтаксиса для заглушки примерно эквивалентны. Тем не менее, вы всегда можете использовать doReturn/whenдля заглушки; но есть случаи, когда вы не можете использовать when/thenReturn. Скопирование пустых методов является одним из таких. Другие включают использование со шпионами Мокито, и повторение одного и того же метода более одного раза.

Одна вещь, которая when/thenReturnдает вам, doReturn/whenно не дает, это проверка типа возвращаемого вами значения во время компиляции. Тем не менее, я считаю, что это почти не имеет значения - если вы ошиблись в типе, вы узнаете, как только запустите тест.

Я настоятельно рекомендую только использовать doReturn/when. Нет смысла изучать два синтаксиса, когда один подойдет.

Возможно, вы захотите сослаться на мой ответ в « Формирование грамматики» Мокито - более подробный ответ на очень тесно связанный вопрос.


17
Я вроде не согласен с Дэвидом. Я часто сталкиваюсь с ситуациями, когда при использовании возвращаю неправильный тип, doReturn/whenи провожу следующие несколько минут, выясняя, что пошло не так. Проверка типа компиляции становится чрезвычайно полезной when/thenReturn.
Сакет

11
Просто помните, что Mockito рекомендует использовать when/thenReturnвместо doReturn/when.
CodyEngel

2
@CodyEngel, и нет никаких причин для такой рекомендации, кроме того, что я изложил в своих ответах здесь и на stackoverflow.com/q/11462697 . Несколько лет назад я обсуждал это с Брайсом Дютеилом, который в настоящее время исполняет обязанности ведущего разработчика Mockito, и, насколько мне известно, он согласен. Я попрошу его оставить комментарий здесь (нет гарантии, что он это сделает).
Дауд ибн Карим

20
В Javadoc говорится , что doReturn/whenпредставляет собой компромисс. Команда не рекомендует так или иначе, но отмечает, что этот when/thenподход более интуитивен, более читабелен и предлагает проверку времени компиляции, именно этот подход сделал Mockito популярным и простым в использовании, не забывайте, что когда база кода используется совместно различные навыки в вашей команде; все же у этого есть недостатки относительно шпионов и недействительных методов.
Брайс

5
Просто для справки: doReturn()имеет большой недостаток - превращение в кодирование вызовов методов в стиле YODA. Вещество позже записывается первым. Большинство людей читают слева направо; так что теперь вы должны постоянно помнить, чтобы изменить логику возврата, когда в вашей голове.
GhostCat
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.