У вас есть класс 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
работает при идеальной реализации интерфейса.