Некоторое время назад я прочитал в ответе о переполнении стека, которое не могу найти, предложение, объясняющее, что вы должны тестировать публичные API, и автор сказал, что вы должны тестировать интерфейсы. Автор также объяснил, что если реализация метода изменилась, вам не нужно изменять тестовый пример, поскольку это нарушит контракт, обеспечивающий работоспособность тестируемой системы. Другими словами, тест должен завершиться неудачей, если метод не работает, но не потому, что реализация изменилась.
Это привлекло мое внимание, когда мы говорим о насмешках. Поскольку моделирование в значительной степени зависит от ожидаемых вызовов от зависимостей тестируемой системы, моделирование тесно связано с реализацией, а не с интерфейсом.
При исследовании mock vs stub несколько статей соглашаются с тем, что вместо mock следует использовать заглушки, так как они не полагаются на ожидания от зависимостей, а это означает, что тест не требует знания базовой системы при реализации теста.
Мои вопросы будут:
- Нарушают ли насмешки принцип открытого / закрытого?
- Чего не хватает в аргументе в пользу заглушек в последнем абзаце, которые делают заглушки не такими уж хорошими по сравнению с насмешками?
- Если да, то когда будет хорошим вариантом использования для насмешки и когда будет хорошим вариантом использования заглушки?
Since mocking relays heavily on expectation calls from system under test's dependencies...
Я думаю, что это то место, где ты ошибаешься. Макет - это некое искусственное представление внешней системы. Он никоим образом не представляет внешнюю систему, за исключением того, что он моделирует внешнюю систему таким образом, что позволяет выполнять тесты с кодом, имеющим зависимости от указанной внешней системы. Вам все еще понадобятся интеграционные тесты, чтобы доказать, что ваш код работает с реальной, немодированной системой.