Я обычно предпочитаю использовать макеты из-за ожиданий. Когда вы вызываете метод для заглушки, который возвращает значение, он обычно просто возвращает вам значение. Но когда вы вызываете метод в макете, он не только возвращает значение, но и заставляет ожидать, что вы установили, что метод был вызван вообще. Другими словами, если вы устанавливаете ожидание, а затем не вызываете этот метод, генерируется исключение. Когда вы устанавливаете ожидание, вы, по сути, говорите: «Если этот метод не вызывается, что-то пошло не так». И наоборот: если вы вызываете метод на макете и не устанавливаете ожидание, он выдаст исключение, по сути говоря: «Эй, что вы делаете, вызывая этот метод, когда вы его не ожидали».
Иногда вам не нужны ожидания для каждого метода, который вы вызываете, поэтому некоторые фреймворки допускают «частичные» макеты, которые похожи на гибриды макет / заглушка, в том смысле, что применяются только те ожидания, которые вы установили, и любой другой метод вызов обрабатывается больше как заглушка в том смысле, что он просто возвращает значение.
Единственное подходящее место для использования заглушек, о которых я могу подумать с самого начала, - это когда вы вводите тестирование в устаревший код. Иногда просто сделать заглушку с помощью создания подкласса класса, который вы тестируете, чем рефакторинг всего, чтобы сделать насмешку легкой или даже возможной.
И к этому ...
Избегайте использования макетов всегда, потому что они делают тесты хрупкими. Ваши тесты теперь имеют сложные знания о методах, вызываемых реализацией, если измененный интерфейс меняется ... ваши тесты ломаются. Так что используйте свое лучшее суждение .. <</p>
... Я говорю, что если мой интерфейс изменится, мои тесты лучше прервутся. Потому что весь смысл модульных тестов заключается в том, что они точно проверяют мой код в том виде, в котором он существует сейчас.