Функция-заглушка

Функция-заглушка (англ. 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]

Примечания

  1. Nell B. Dale. Programming in C++ : [англ.] / Nell B. Dale, Chip Weems. — Jones & Bartlett Learning, 2004. — P. 308. — ISBN 978-0-7637-3234-9.
  2. 1 2 3 4 5 6 7 8 Stubbing (англ.). WireMock Glossary. Дата обращения: 26 августа 2026.
  3. Заглушка (Stub). Radar4site. Дата обращения: 26 августа 2026.
  4. Mocks Aren't Stubs (англ.). MartinFowler.com. Дата обращения: 26 августа 2026.
  5. TypeScript Promise setTimeout Mock Data. Gist. GitHub. Дата обращения: 26 августа 2026.
  6. Microsoft Fakes - Stubs and Shims. Дата обращения: 26 августа 2026.
  7. Using stubs to isolate parts of your application from each other for unit testing. Microsoft Learn. Microsoft. Дата обращения: 26 августа 2026.
  8. 1 2 Лекция 7. Mock-объекты (PDF). Петрозаводский государственный университет. Дата обращения: 26 августа 2026.
  9. 1 2 3 Mocks vs Stubs vs Fakes vs Spies. GitHub Gist. Дата обращения: 26 августа 2026.
  10. 1 2 3 Stubs vs Mocks. GeeksforGeeks. Дата обращения: 26 августа 2026.
  11. 1 2 3 4 Mock vs Stub: What's the Difference? Speedscale Blog. Дата обращения: 26 августа 2026.
  12. Как быстро поднять gRPC-заглушку на Java для тестирования и нагрузочных сценариев. Performance Lab. Дата обращения: 26 августа 2026.
  13. API Set Loader Operation. Microsoft Learn. Microsoft. Дата обращения: 26 августа 2026.
  14. Windows API Sets. Microsoft Learn. Microsoft. Дата обращения: 26 августа 2026.
  15. Самые точные инструменты валидации API-тестов. TestSprite. Дата обращения: 26 августа 2026.
  16. Про микросервисную архитектуру: что это. Яндекс Практикум. Дата обращения: 26 августа 2026.
  17. Mock API в микросервисной архитектуре. Lightbox API. Дата обращения: 26 августа 2026.
  18. Как быстро поднять gRPC заглушку на Java для тестирования и нагрузочных сценариев. Performance Lab. Дата обращения: 26 августа 2026.
  19. Test-Driven Development. Ariel Softwares. Дата обращения: 26 августа 2026.
  20. TDD AI Agents Best Practices. QA Skills. Дата обращения: 26 августа 2026.

Литература

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.

Ссылки