Мокито
Мокито — это модуль, созданный по образцу популярного Java-фреймворка для тестирования Mockito. Он расширяет возможности тестирования, позволяя легко изменять поведение системы, подменяя результаты работы методов, отключая алгоритмы и проверки.
Что такое мокирование?
Мокирование — это техника, которая позволяет заменить реальное поведение методов на заранее заданное. Это полезно, когда:
- Вы хотите протестировать код, который зависит от внешних систем или сложных алгоритмов.
- Вы хотите убедиться, что методы вызываются с правильными параметрами.
- Вы хотите отключить часть логики, чтобы сосредоточиться на тестировании конкретного участка кода.
Возможности Мокито
С помощью Мокито вы можете:
- Изменять поведение методов: Указывать, в каких случаях методы должны возвращать определенные значения, выбрасывать исключения или вообще не выполняться.
- Настраивать условия: Задавать условия для параметров методов, чтобы изменения применялись только в нужных случаях.
- Мокировать приватные и экспортные методы: Мокировать как публичные, так и приватные методы объектов, документов, справочников и других элементов.
- Собирать статистику: Наблюдать за вызовами методов, чтобы убедиться, что они вызываются с правильными параметрами.
ТелоОтвета = Новый Структура("success": Истина);
// Настройка мокирования
Мокито.Обучение(РаботаСHTTP)
.Когда("ОтправитьЗапрос").Вернуть(
ЮТест.Данные().HTTPОтвет()
.УстановитьКодСостояния(200)
.УстановитьТело(ТелоОтвета))
.Прогон();
// Тестовый прогон
Результат = РаботаСHTTP.ОтправитьЗапрос("https://example.com");
// Проверка
ЮТест.ОжидаетЧто(Результат.КодСостояния).Равно(200);
Мокирование доступно для любых методов конфигурации (или почти любых):
- Методы общих модулей
- Методы менеджеров
- Методы объектов (документов, справочников и т.д.)
- Методы отчетов и обработок
- События объектов конфигурации
- Методы модулей прочих объектов конфигурации
Что Мокито не может?
- Выполнять произвольную логику при вызове метода.
- Изменять параметры методов.
- Хранить результаты вызовов при сборе статистики.
Как работает Мокито?
Мокито работает на основе двух ключевых механизмов:
- Расширение методов: Мето ды конфигурации заменяются (
&Вместо
) на специальные обработчики, которые позволяют управлять их поведением. - Глобальный контекст: Все настройки и статистика вызовов хранятся в глобальном контексте, что позволяет получить к ним доступ как из теста (для настройки), так и из замененных методов (для анализа).
Мокито работает через заимствование методов конфигурации, что накладывает определенные ограничения. Подмена поведения возможна только для методов конфигурации. Это означает, что мокирование недоступно для:
- Методов платформы (встроенных методов 1С).
- Методов расширений.
- Методов внешних обработок или отчетов.
Таким образом, Мокито эффективно работает только в рамках методов, определенных в самой конфигурации. Это важно учитывать при про ектировании тестов и выборе подходов к тестированию.
Детально принципы работы Мокито описаны в отдельной статье. Она поможет вам глубже разобраться в механизмах мокирования, понять, как работает подмена методов, настройка поведения и сбор статистики вызовов. Это полезно для тех, кто хочет максимально эффективно использовать Мокито в своих тестах и лучше понять его внутреннюю логику.
Подготовка
В первую очередь, необходимо добавить мокируемый метод в расширение конфигурации. Это можно сделать с помощью стандартной команды IDE "Добавить метод в расширение". После этого нужно добавить шаблонный код для мокирования.
Для упрощения процесса:
- В EDT доступны специальные команды, которые автоматически добавляют необходимый код для моков.
- В конфигураторе можно использовать готовые шаблоны, чт обы быстро настроить мокирование.
Шаблоны заимствованных методов
-
Для функции:
&Вместо("<ИмяМетода>")
Функция Мок_<ИмяМетода>(<ПараметрыМетода>)
ПараметрыМетода = Мокито.МассивПараметров(<ПараметрыМетода>);
ПрерватьВыполнение = Ложь;
Результат = МокитоПерехват.АнализВызова(<Объект>, "<ИмяМетода>", ПараметрыМетода, ПрерватьВыполнение);
Если Не ПрерватьВыполнение Тогда
Возврат ПродолжитьВызов(<ПараметрыМетода>);
Иначе
Возврат Результат;
КонецЕсли;
КонецФункции -
Для процедуры:
&Вместо("<ИмяМетода>")
Процедура Мок_<ИмяМетода>(<ПараметрыМетода>)
ПараметрыМетода = Мокито.МассивПараметров(<ПараметрыМетода>);
ПрерватьВыполнение = Ложь;
МокитоПерехват.АнализВызова(<Объект>, "<ИмяМетода>", ПараметрыМетода, ПрерватьВыполнение);
Если Не ПрерватьВыполнение Тогда
ПродолжитьВызов(<ПараметрыМетода>);
КонецЕсли;
КонецПроцедуры
Параметры:
<ИмяМетода>
— Имя мокируемого метода.<ПараметрыМетода>
— Параметры мокируемого метода.<Объект>
— Объект-владелец метода:- Для общих модулей — ссылка на общий модуль (например,
ОбщегоНазначения
). Лучше не использоватьЭтотОбъект
. - Для объектов (справочники, документы, наборы, формы) —
ЭтотОбъект
. - Для менеджеров — ссылка на менеджер (например,
Справочники.Пользователи
).
- Для общих модулей — ссылка на общий модуль (например,
Если метод не имеет параметров, можно использовать пустой массив:
ПараметрыМетода = Новый Массив;
Этапы тестирования с Мокито
После добавления заимствованного метода-перехватчика в расширение конфигурации, вы можете начинать писать тесты с использованием Мокито для этого метода.
В общем случае тестирование с использованием Мокито состоит из трех этапов:
-
Обучение:
На этом этапе настраивается мокирование — указывается, какие методы нужно мокировать, при каких условиях (параметрах) и как они должны себя вести. Вы задаете поведение моков, например, возврат определенных значений, выброс исключений или пропуск выполнения. -
Прогон:
На этом этапе выполняется тестовый метод с применением настроенных моков. Вызывается проверяемая функция, которая использует мокируемые методы. В процессе выполнения вместо реальных методов используются их моки, что позволяет изолировать тестируемую логику. -
Проверка:
На завершающем этапе анализируются вызовы методов, чтобы убедиться, что все работает как ожидается. Проверяется, сколько раз методы были вызваны, с какими параметрами и в правильной ли последовательности.
Пример:
// Подготовка
Ответ = ЮТест.Данные().HTTPОтвет()
.УстановитьКодСостояния(200)
.УстановитьТело(Новый Структура("id, status", "9999", "delivered"));
// Обучение Мокито
Мокито.Обучение(ОтправкаСМС_Провайдер1)
.Когда("УстановитьСоединение").Вернуть(Истина)
.Когда("ПослатьСообщение").Вернуть(Ответ)
.Прогон();
// Тестовый прогон
РоботОтправки.ОтправкаСМС();
// Проверка статистики
Мокито.Проверить(ОтправкаСМС_Провайдер1)
.КоличествоВызовов("ПослатьСообщение")
.Равно(1);
Обучение мокирования
Обучение — это процесс настройки Мокито. Вы указываете, какие методы и при каких условиях должны изменить свое поведение.