У вас есть класс X, и вы пишете несколько модульных тестов, которые проверяют поведение X1. Есть также класс A, который принимает X в качестве зависимости.
Когда вы пишете модульные тесты для A, вы имитируете X. Другими словами, во время модульного тестирования A вы устанавливаете (постулируете) поведение макета X для X1. Время идет, люди используют вашу систему, потребности в изменениях, X развивается: вы модифицируете X, чтобы показать поведение X2. Очевидно, что модульные тесты для X не пройдут, и вам нужно будет их адаптировать.
Но что с А? Модульные тесты для A не будут терпеть неудачу, когда поведение X изменено (из-за насмешки над X). Как определить, что результат A будет отличаться при запуске с «реальным» (модифицированным) X?
Я ожидаю ответов по типу: «Это не цель модульного тестирования», но какое значение тогда имеет модульное тестирование? Действительно ли это говорит вам только о том, что, когда все тесты пройдены, вы не внесли существенных изменений? И когда поведение какого-то класса изменяется (добровольно или невольно), как вы можете обнаружить (предпочтительно автоматическим способом) все последствия? Разве мы не должны больше фокусироваться на интеграционном тестировании?
X1вы говорите, что Xреализует интерфейс X1. Если изменить интерфейс X1к X2Мок , который вы использовали в других тестах не должно составлять больше, поэтому вы вынуждены исправить эти тесты тоже. Изменения в поведении класса не должны иметь значения. Фактически, ваш класс Aне должен зависеть от деталей реализации (что вы и должны изменить в этом случае). Таким образом, модульные тесты для Aпо-прежнему правильны, и они говорят вам, что Aработает при идеальной реализации интерфейса.