Мокирование
Вводная
Мокирование - это инструмент/подход для изоляции тестируемых частей кода и контроля над зависимостями.
При мокировании, мы вместо реальных (продуктовых) объектов подсовываем моки - подделки, фальшивки. Это "двойники" реальных объектов.
Например:
- Вместо, реального почтового сервера мы можем поднять в докере легковесный smtp сервер и настроить систему на взаимодействие с ним
- Используя SOAP UI/Postman/Wiremock или что-то другое мы сможем протестировать систему без использования реального сервиса
- Не редко вместо поднятия промышленной СУБД в тестах используются легковесные встраиваемые СУБД (sql lite, h2)
Все это относится к мокированию и позволяет упростить процесс поднятия окружения для тестов.
Но также моки могу т быть использованы непосредственно при тестировании, например вместо реального документа в тестируемый метод вы можете передать структуру, содержащую все нужные реквизиты (Dummy, болванка), либо обработку с нужными методами (Мок), либо что-то иное, что позволяет вам упростить тест.
Например, при тестировании http-сервисов передаем мок, который "притворяется" запросом, реализует интерфейс объекта HTTPСервисЗапрос
.
Основное ограничение такого подхода - обработки и структуры должны передаваться в качестве параметров в тестируемый метод. Если нам очень необходимо подменить объект, который вычисляется внутри метода, то приходится попотеть, либо передавать его в качестве доп. параметров и закладывать работы с ним в конфигурации, либо с помощью расширения возвращать жестко закодированное значение. Каждый раз, в таких случаях, приходится что-то изобретать и выдумывать способ внедрения моков.
Мокито
Для унификации подхода к работе с моками мы разработали инструмент Мокито, который облегчает тестирование.
Он предоставляет
- подход к внедрению моков
- программный интерфейс для управления моками.
Например, у нас есть метод отправки СМС, через шлюз.
Он использует запросы к внешнему ресурсу, СМС шлюзу, который необходим в текущей схеме. Для решения этой проблемы мы можем:
- Отправлять реальные СМС в тестах
- Использовать тестовый шлюза, если провайдер предоставляет такую возможность
- Поднять мокирующий web-server
- Заложить в код обходы для тестирования
- Воспользоваться Мокито, написав в тесте:
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СериализацияJSON.ЗначениеВСтроку(Новый Структура("id, status",
"9999",
"delivered")));
Мокито.Обучение(ОтправкаСМС_Провайдер1)
.Когда("ПослатьСообщение") // Теперь, вместо реального запроса к шлюзу
.Вернуть(Ответ) // метод всегда будет возвращать нужный нам ответ
.Прогон();
РоботОтправки.ОтправкаСМС();
В это случае, при отправке, не будут выполнятся запросы к шлюзу, вместо этого метод ПослатьСообщение
вернет предопределенный результат.
Подробнее о возможностях и принципах работы с Мокито, вы можете почитать в отдельной статье.