whirlwind
TDD infected, paranoid
Теперь давайте разберемся откуда растут ноги и почему это не сработает в большинстве случаев. Во-первых первоисточник, насколько я понялВообще, если уж говорить о моках, мокать чужие контракты — так себе затея («don't mock what you don't own»). Тебе может только казаться, что ты понимаешь контракт какой он есть, делая свой мок, а в реальности он может вести себя иначе. Не мокают, например, всякие DataMapper, а пишут интеграционные тесты с реальным MySQL. Если ты будешь придерживаться этого правила, то тебя не будет как минимум раздражать то, что содержится в чужих библиотеках. Они не твои, поддерживать обратную совместимость при изменениях в них не тебе, поэтому ныть по поводу присутствия final как-то даже неэтично, это как требовать бесплатно поработать.
TDD: Only mock types you own | Mark Needham
Liz recently posted about mock objects and the original 'mock roles, not objects' paper and one thing that stood out for me is the idea that we should only mock types that we own. I think this is quite an important guideline to follow otherwise we can end up in a world of pain. One area which...
markhneedham.com
Что мы видим? 1 страница с описанием одного конкретного кейса. Из 5 комментов под текстом 2 спамных, а остальные выражают несогласие или сомнения. Можно еще порыться и найти кучу дебатов на стэке, но положа руку на сердце, с чего вы решили сделать из этой фразы икону уровня TDA, KISS, etc? Это мнение отдельного человека, который даже не удосужился показать нам проблему в виде кода.
Если мок ведет себя иначе, значит вашк контракт нечеткий (контракт дерьмо). Если вы используете язык, которые позволяет нечеткие контракты (слабая типизация, вольности с сигнатурами вызовов), то вы сами себе злобные буратины. При чем тут моки? Мок это просто еще одна реализация, соответствующая контракту. Если вы костьми ложитесь за implements, то никаких проблем с моками быть не должно - это одно и то же.
Теперь пойдем дальше. Вы зациклились на конкретных кейсах из веб разработки. Можно привести массу примеров где нет иного выбора, кроме как мокать. Например, вам нужно протестировать взаимодействие с удаленной платежной системой. Сколько денег вам понадобится закинуть на счет, что бы их хватило для ежедневной сборки? А что если ПС предусматривает off-work часы? Предположим, что вы тестируете работу банкомата. Для связи с оборудованием используется библиотека, которая без оборудования вполно предсказуемо кидает эксепшены. Таких примеров миллион. С entities это работает, потому что все знают про inmemory tables. И потому что залить sql фикстуру в базу легко. Возьмите более сложные случаи, более строгий язык и более продвинутый мок фреймворк. Никаких проблем с моканьем любых абстракций нет.
PS. А уж каким боком из этого текста выводится оправдание файналам это вообще загадка.
PPS. В спринге сегодня есть инструменты для тестирования по описанию Марка. И они прямым текстом называются интеграционными. Моки используются для изоляции в модульных тестах. Кто не понимает разницу - бегом в википедию читать про азы тестирования.
Последнее редактирование: