Мой опыт состоит в том, чтобы использовать макеты только в границах (подс) систем. Если у меня есть два тесно связанных класса, я не смеюсь над ними, а проверяю их вместе. Примером может быть составной и посетитель. Если я тестирую конкретного посетителя, я не использую макет для композита, но создаю реальные композиты. Можно утверждать, что это не юнит-тест (зависит от определения того, что такое юнит). Но это не так важно. То, что я пытаюсь достичь, это:
- Пишите читаемые тесты (тесты без макетов в большинстве случаев легче читать).
- Проверка только сфокусированной области кода (в примере конкретный посетитель и соответствующая часть композита).
- Пишем быстрые тесты (пока я создаю экземпляры только нескольких классов, в примере конкретные композиты, это не проблема ... следите за переходными созданиями).
Только если я сталкиваюсь с границей подсистемы, я использую макеты. Пример: у меня есть компоновка, которая может визуализировать себя для рендерера. Я бы смоделировала рендер, если бы проверила логику рендеринга компоновщика.
Тестирование поведения вместо состояния сначала выглядит многообещающе, но в целом я бы тестировал состояние, так как полученные тесты легче поддерживать. Насмешки - это пушка. Не разбивайте гайку кувалдой.