Функция-заглушка
Функция-заглушка (англ. method stub) — это короткая и простая замещающая реализация функции или метода, который ещё не реализован для использования в работе программы[1]. Обычно функция-заглушка содержит минимальное количество кода, чтобы её можно было вызвать: объявление с любыми необходимыми параметрами и, если требуется, возвращаемое значение.
Функции-заглушки часто используются для реализации интерфейсов, когда их полная реализация ещё не готова, но требуется структурно завершённая программа.
В современной практике разработки понятие функции-заглушки объединяет как классический подход (создание временной реализации для успешной компиляции системы), так и современный API stubbing. В этом качестве заглушки выступают как контролируемые заменители зависимостей и виртуальные симуляторы недоступных или сторонних сервисов, которые возвращают заранее заданные ответы на вызовы (например, имитируют HTTP-ответы), позволяя изолированно тестировать логику без прямого взаимодействия с реальными объектами[2][3][4].
Пример
В следующем примере на псевдокоде функция ReadThermometer возвращает фиксированное значение, хотя в будущем должна считывать его с аппаратного источника. Она возвращает корректное значение, позволяя остальному коду выполняться. Входной параметр source игнорируется — это типично для заглушек.
function ReadThermometer(Source source)
return 28
end function
Пример реализации функции-заглушки на TypeScript для имитации асинхронного вызова API с использованием Promise и setTimeout[5]:
function getMockData(): Promise<{ type: string; data: string }> {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
type: 'Success',
data: 'mocked data',
});
}, 1000);
});
}
Пример использования Microsoft Fakes (C#) для создания заглушки интерфейса и переопределения возвращаемого значения[6][7]:
IDataProvider fakeProvider = new FakesBasics.Fakes.StubIDataProvider()
{
GetPersonInt32 = (id) =>
{
return new Person() { Id = id, FirstName = "John", LastName = "First" };
}
};
Связанные понятия
В контексте разработки API главное отличие функции-заглушки (Stub) от мок-объекта (Mock) заключается в том, что заглушка фокусируется на возвращаемом состоянии (предоставляя заранее заданные ответы), тогда как мок-объект — на проверке поведения и взаимодействия[2][8].
| Характеристика | Stub (Заглушка) | Mock (Мок-объект) |
|---|---|---|
| Основная цель | Предоставление заранее заготовленных ответов на запросы[2][9]. | Проверка правильности взаимодействия (вызовов, аргументов, побочных эффектов)[2][10]. |
| Тип тестирования | Тестирование на основе состояния (State-based testing)[2][11]. | Тестирование на основе поведения (Behavior-based testing)[2][11][9]. |
| Отвечает на вопрос | «Что возвращает зависимость?»[2] | «Была ли зависимость вызвана корректно?»[2] |
| Сложность и применение | Проще в настройке. Подходит для симуляции изолированного API-вызова[11]. | Сложнее. Содержит ожидания вызовов, используется для валидации API-контрактов[11][9]. |
| Проверка вызовов | Как правило, не проверяет, как именно используется тестируемым кодом[10]. | Предназначен специально для проверки того, как с ним взаимодействуют[10][8]. |
Распределённые вычисления
В сфере распределённых вычислений термин «заглушка» применяется для объектов, имитирующих работу существующего кода или процедур, например, удалённой процедуры — схоже с имитатором (англ. mock object). Такие заглушки полезны при портировании программ.
В терминологии удалённых вызовов методов (англ. Remote Method Invocation, RMI) клиентская заглушка взаимодействует с скелетом на стороне сервера.
В современных системах удалённого вызова процедур (например, в gRPC) клиентские заглушки, генерируемые из файлов .proto, берут на себя внутреннюю логику и абстрагируют сетевое взаимодействие. При вызове метода заглушка осуществляет маршалинг данных — сериализацию аргументов в компактный бинарный формат Protocol Buffers. Затем среда выполнения упаковывает сериализованные данные в gRPC-фреймы для передачи поверх протокола HTTP/2. После получения ответа от сервера заглушка десериализует данные обратно в структуры языка программирования и возвращает результат вызывающему коду[12].
Windows и MS-DOS
В Windows и MS-DOS заглушка функционирует как прослойка — небольшой интерфейсный код, сохраняющийся в обычной памяти после самоперемещения основной части резидентного драйвера в Верхняя память, расширенную или дополнительную память; а также служит для связи перемещённого кода с реальным режимом DOS совместно с расширителями DOS (например, DPMI, DPMS, CLOAKING, NIOS).
В современных версиях Windows эволюцией функций-заглушек стал механизм API-sets (например, api-ms-win-core-*). Эти виртуальные DLL функционируют в качестве прослоек, перенаправляющих вызовы и разрешающих имена во время загрузки приложения. Системный загрузчик перехватывает обращения к таким библиотекам и с помощью специальной конфигурационной базы данных ОС (схемы API-sets) в реальном времени сопоставляет виртуальное имя с целевым бинарным файлом, содержащим фактическую реализацию функций. Это позволяет прозрачно изменять системные библиотеки, сохраняя совместимость для приложений[13][14].
Применение в тестировании и микросервисах
В современном тестировании ключевые принципы использования заглушек (API stubbing) включают изоляцию тестов от нестабильных внешних зависимостей, детерминированную валидацию (проверку обработки ошибок и преобразований данных в предсказуемых условиях) и опережающее тестирование, позволяющее проверять поведение клиента до полной готовности реальных сервисов[15].
В микросервисной архитектуре заглушки обеспечивают изоляцию компонентов и независимую работу команд[16]. Использование заглушек на основе общих контрактов взаимодействия (например, OpenAPI для REST или .proto-файлов для gRPC) позволяет вести параллельную разработку. Подход Contract-First даёт возможность автоматически генерировать заглушки, тестировать клиентские части без готового бэкенда и снижает риск несовместимости при интеграции[17].[18]
Создание функций-заглушек и базовых тестовых наборов активно автоматизируется с помощью ИИ-ассистентов, берущих на себя рутинные задачи по генерации моков и тестовых данных. Это влияет на методологию разработки через тестирование (TDD), которая становится критически важным слоем проверки. Разработчик концентрируется на проектировании поведения и фиксации спецификаций в виде тестов до написания кода, делегируя ИИ механическую реализацию[19].[20]
Примечания
Литература
Nell B. Dale. Programming in C++ : [англ.] / Nell B. Dale, Chip Weems. — Jones & Bartlett Learning, 2004. — P. 308. — ISBN 978-0-7637-3234-9. Freeman, Eric. Head First Design Patterns : [англ.] / Eric Freeman, Elisabeth Freeman, Kathy Sierra … [et al.]. — O'Reilly, 2004. — Vol. 1. — P. 440. — ISBN 978-0-596-00712-6.
Ссылки
- Генератор заглушек для C++ (PDF)
- Stub/mock-фреймворки для Java (обзор и сравнение заглушек и имитаторов для Java)