Макет об'єкта

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Макети об'єктів (англ. Mock Object) у об'єктно-орієнтованому програмуванні - це об'єкти, що імітують поведінку справжніх об'єктів контрольованими способами, тобто, реалізують інтерфейси справжніх об'єктів, але не мають власної реальної функціональності. Програміст зазвичай створює макет об'єкта для тестування поведінки деяких інших об'єктів, багато в чому так само, як автомобільний дизайнер використовує манекен, що може рухатися, для імітації динамічної поведінки людини в транспортній аварії.

Де варто використовувати[ред.ред. код]

У модульному тестуванні, фіктивні об'єкти можуть моделювати поведінку складних, реальних (не макетних) об'єктів і, отже, корисні, коли реальний об'єкт недоцільно або неможливо використати в модульному тесті. Якщо об'єкт має будь-яку з наведених нижче характеристик, це може бути корисно використовувати фіктивний об'єкт на своєму місці:

  • надає недетерміновані результати (наприклад, час або температуру);
  • є сценарії, які важко створити або відтворити (наприклад, помилка в мережі);
  • повільно працює (наприклад, повна база даних, яка повинна бути ініціалізована до початку тестування);
  • об'єкт ще не існує або може змінити поведінку;
  • об'єкт повинен включати в себе інформацію і методи виключно для цілей тестування (а не для реального використання).

Наприклад, створюється програма, що реагує на показники датчика, що вимірює температуру у приміщенні. Необхідно перевірити, що у програмі виникне попередження, якщо температура у приміщенні впаде нижче деякого рівня. Реально знижувати температуру приміщення - складно та недоцільно. Тому виправданим є створення макету для датчика температури, що надає дані про температуру у такому ж форматі, що і реальний датчик, але програміст має змогу керувати даними, що повертає такий датчик.

Типи макетних об'єктів[ред.ред. код]

Макетні об'єкти можуть лише повертати вказані результати або також запам'ятовувати факт викликів своїх методів, та, якщо у тестовому сценарії, де обовязково тестований обєкт мав викликати деякий метод макетного об'єкта, але не зробив цього, повідомляти про невиконання тесту. Також існують макетні обєкти, що просто реалізують інтерфейс реальних (деякою порожньою реалізацією), і програміст не може керувати ними.

Деталі використання[ред.ред. код]

Макетні об'єкти та реальні об'єкти, які вони імітують, мають однакові інтерфейси, що дозволяє клієнту об'єкта не відчувати різниці, реальні об'єкти він використовує чи фіктивні. Сучасні фреймворки для модульного тестування дозвояють програмісту легко створювати макетні обєкти заданого інтерфейсу або базового типу, вказувати необхідний результат для викликів методів та властивостей макетних обєктів, вказувати, які параметри мають бути передані тому чи іншому методу, які методи чи властивості взагалі мають викликатися - факт усіх обов'язкових для тесту викликів методів макетного об'єкту може бути перевірено у модульному тесті.

Сучасні бібліотеки, що дозволяють автоматизоване створення макетним об'єктів[ред.ред. код]

Для мови програмування C Sharp :

Для мови програмування Python :

Для мови програмування Ruby on Rails :

Застереження щодо використання[ред.ред. код]

Використання макетних об'єктів може прив'язати юніт-тести до фактичної реалізації коду, який проходить випробування. Наприклад, фреймворків для юніт-тесутвання дозволяють розробнику перевіряти, скільки разів і у якому порядку тестований об'єкт викликає макетний об'єкт; рефакторинг може змінити порядок таких викликів, і, при тому що фактично код залишатиметься робочим, тест буде не пройдено. Такі тести називають крихкими. Це доводить, що макетний об'єкт має імітувати лише зовнішню поведінку справжнього, і не привязуватися до деталей внутрішньої реалізації.