Представьте, что вы собираетесь написать класс, который не существует.Может быть, это контроллер.Это не то, что напрямую говорит с базой данных.
У вас есть хорошее представление о том, как оно должно себя вести, и вы знаете, за что оно должно отвечать и что оно должно делегировать какой-то другой службе (используя SingleПринцип ответственности).Поэтому вы пишете интерфейсы для представления ролей вспомогательных классов, которые он собирается использовать.
Затем вы пишете пример того, как вы можете использовать свой класс, который собираетесь создать.Если хотите, можете назвать пример юнит-тестом.Вы макете взаимодействия с классами помощников.Когда вы запускаете пример, он терпит неудачу, потому что вы еще не написали код.Теперь вы можете написать код для его прохождения, используя интерфейсы вспомогательных классов - которые вы также еще не написали.
Затем вы делаете то же самое с вспомогательными классами, вычеркивая их помощников.
В конце концов вы достигнете класса, который обращается к базе данных.Или, может быть, это говорит с веб-сервисом.Или, возможно, данные являются статическими, или в памяти.(Это не имеет значения для исходного класса, потому что ваш класс отделен от этого).
На этом этапе вам понадобится пример, чтобы описать поведение этого класса, а также, если это база данныхСоединитель, вам понадобится база данных для примера.
При написании кода таким способом получается код, который легко использовать и понимать, и ничего лишнего, что не нужно для чего-то еще в стеке.Это обычно более надежно, чем код, который легче написать.Вот почему мы иногда используем mock - потому что написание тестов с использованием mocks помогает создать хороший, поддерживаемый, отделенный дизайн.