Як згадується у голосуванні у відповідь, Мартін Фаулер обговорює ці відмінності у Mocks Aren't Stubs , і, зокрема, у підзаголовку The Difference Between Mocks and Stubs , тому обов'язково прочитайте цю статтю.
Замість того, щоб концентруватися на тому, як ці речі відрізняються, я думаю, що більш приємно зосередитися на тому, чому це різні поняття. Кожна існує з іншою метою.
Підробки
Підробка є реалізацією , яка поводиться «природно», але не «реальний». Це нечіткі поняття, і тому різні люди по-різному розуміють, що робить речі підробкою.
Одним із прикладів підробки є база даних в пам'яті (наприклад, використання sqlite з :memory:
магазином). Ви ніколи не використовуєте це для виробництва (оскільки дані не зберігаються), але він цілком адекватний як база даних для використання в тестовому середовищі. Це також набагато легше, ніж "справжня" база даних.
В якості іншого прикладу, можливо, ви використовуєте якийсь сховище об'єктів (наприклад, Amazon S3) у виробництві, але в тесті ви можете просто зберегти об'єкти у файли на диску; то реалізація "збереження на диску" була б підробкою. (Або ви навіть можете підробити операцію "збереження на диску", використовуючи замість цього файлову систему в пам'яті.)
В якості третього прикладу уявіть об’єкт, що забезпечує API кешу; об’єкт, який реалізує правильний інтерфейс, але просто не виконує кешування взагалі, але завжди повертає пропуск кеша, був би своєрідною підробкою.
Мета підробки - не впливати на поведінку тестованої системи , а скоріше спростити виконання тесту (шляхом усунення зайвих або важких залежностей).
Заглушки
Заглушка є реалізація , яка поводиться «неприродно». Заздалегідь налаштовано (зазвичай за допомогою тестової установки), щоб відповідати на конкретні входи із конкретними виходами.
Призначення заглушки полягає в тому, щоб перевірити вашу систему на певний стан. Наприклад, якщо ви пишете тест на якийсь код, який взаємодіє з API REST, ви можете заглушити API REST з API, який завжди повертає консервовану відповідь, або він відповідає на запит API з певною помилкою. Таким чином можна писати тести, які стверджують про те, як система реагує на ці стани; наприклад, тестування відповіді, яку отримують ваші користувачі, якщо API повертає помилку 404.
Заглушка зазвичай реалізується лише для того, щоб відповідати на точні взаємодії, на які ви сказали. Але ключовою особливістю, яка робить щось заглушкою, є її мета : заглушка - все про налаштування вашого тестового випадку.
Знущаються
Макет схожий на заглушку, але з перевіркою доданою. Мета макета, щоб зробити твердження про те , як ваша система випробовуваної взаємодіяла із залежністю .
Наприклад, якщо ви пишете тест для системи, яка завантажує файли на веб-сайт, ви можете створити макет, який приймає файл, і який ви можете використовувати, щоб стверджувати, що завантажений файл був правильним. Або, у меншому масштабі, звичайно використовувати макет об’єкта для перевірки того, що система, що перевіряється, викликає конкретні методи знученого об'єкта.
Макети пов'язані з тестуванням взаємодії , що є специфічною методологією тестування. Люди, які віддають перевагу тестуванню стану системи, а не системній взаємодії , використовуватимуть знущання мало, якщо взагалі.
Тестовий пар
Підробки, заглушки та глузування належать до категорії тестових пар . Тестовий подвійний - це будь-який об'єкт або система, яку ви використовуєте в тесті замість чогось іншого. Більшість автоматизованих тестувань програмного забезпечення передбачає використання тестових пар, тих чи інших. Деякі інші типи парних пар містять фіктивні значення , шпигуни та чорнобривці вводу / виводу .