Документация

Всё о создании и управлении интеграционными заглушками в Badgermock.

Быстрый старт

  1. Разверните Badgermock — через Helm-чарт в Kubernetes, Docker-образ или JAR на сервере (детали — в инструкции по развёртыванию от вашей команды)
  2. Откройте http://<APP_HOST>:8080/ui/stubs (учётные данные — уточните у администратора вашей инсталляции)
  3. Нажмите + Новый стаб, выберите протокол HTTP
  4. Заполните: имя, метод GET, путь /api/hello, тело ответа {"message": "Hello!"}
  5. Проверьте: curl http://<WIREMOCK_HOST>:18080/api/hello
Список заглушек
Адреса в документации: <APP_HOST> — хост приложения (UI + API, порт 8080), <WIREMOCK_HOST> — хост WireMock-сервера (HTTP/SOAP заглушки, порт 18080). При локальном запуске оба — localhost. В Kubernetes / VM — адреса вашего окружения.

HTTP-заглушки

HTTP-заглушки работают на базе WireMock. При создании заглушки приложение регистрирует маппинг в встроенном WireMock-сервере, который слушает на отдельном порту (по умолчанию 18080).

Детали HTTP-заглушки

Request Matching

Запрос сопоставляется с заглушкой по нескольким критериям. Все заданные критерии должны совпасть одновременно (логическое AND).

HTTP-метод

Обязательное поле. Поддерживаются: GET, POST, PUT, DELETE, PATCH.

Точный путь (path)

Запрос должен совпасть с путём полностью. Лидирующий / добавляется автоматически.

Поле pathЗапросРезультат
/api/usersGET /api/usersСовпадение
/api/usersGET /api/users/123Нет
api/usersGET /api/usersСовпадение (/ добавится)

Паттерн пути (pathPattern) — регулярные выражения

Если заполнено поле pathPattern, оно имеет приоритет над path. Используется Java-regex для гибкого матчинга.

pathPatternЧто матчитПримеры запросов
/api/users/[^/]+Любой ID пользователя/api/users/123, /api/users/abc
/api/v[0-9]+/ordersЛюбая версия API/api/v1/orders, /api/v2/orders
/api/.*Всё, что начинается с /api//api/anything/here
/files/.+\\.pdfЛюбой PDF-файл/files/report.pdf
/api/users/[0-9]\{1,10\}Только числовые ID (до 10 цифр)/api/users/42
Когда использовать pathPattern? Если путь содержит динамические сегменты (ID, версии, имена файлов). Для статических путей достаточно обычного path.

Query-параметры

JSON-объект с параметрами запроса. Каждый параметр проверяется на точное совпадение.

{
  "status": "active",
  "page": "1"
}

Запрос GET /api/users?status=active&page=1 — совпадение. Запрос GET /api/users?status=inactive&page=1 — нет.

Совет: Query-параметры проверяются только те, что указаны в конфигурации. Лишние параметры в запросе не мешают матчингу.

Заголовки запроса (Header Matchers)

JSON-объект с заголовками. Каждый заголовок проверяется на точное совпадение значения.

{
  "X-Api-Key": "my-secret-key",
  "X-Tenant": "acme"
}

Тело запроса (Body Contains)

Строка, которая должна содержаться в теле запроса. Это поиск подстроки, не регулярное выражение.

Как матчить конкретное значение поля в JSON

Body Contains — это поиск подстроки по всему телу запроса. Чтобы сматчить конкретное значение поля, укажите фрагмент JSON как он выглядит в теле:

body_containsТело запросаРезультат
"orderId"{"orderId": "123", "amount": 100}Совпадение
"orderId"{"id": "123"}Нет
order{"orderId": "123"}Совпадение (подстрока)
body_containsТело запросаРезультат
"status":"PAID"{"orderId":"123","status":"PAID"}Совпадение
"status":"PAID"{"orderId":"123","status":"PENDING"}Нет
"type": "refund"{"type": "refund", "amount": 500}Совпадение
"type": "refund"{"type":"refund"}Нет (пробелы не совпали)
Важно: Матчинг чувствителен к пробелам. Строка "status":"PAID" не совпадёт с "status": "PAID" (с пробелом после двоеточия). Убедитесь, что формат фрагмента совпадает с тем, как клиент отправляет JSON.

Пример: комбинация всех критериев

Заглушка сработает только если все заданные критерии совпали:

Метод:          POST
Path Pattern:   /api/orders/[^/]+/pay
Query Params:   {"currency": "RUB"}
Header Matchers: {"X-Api-Key": "secret"}
Body Contains:  "amount"

Запрос, который сматчится:

curl -X POST "http://<WIREMOCK_HOST>:18080/api/orders/ord-42/pay?currency=RUB" \
  -H "X-Api-Key: secret" \
  -H "Content-Type: application/json" \
  -d '{"amount": 1500}'

Настройка ответа

Статус-код

HTTP-статус ответа. По умолчанию: 200. Примеры: 201 (Created), 404 (Not Found), 500 (Server Error).

Тело ответа

Текст, который WireMock вернёт в теле ответа. Может быть JSON, XML, HTML или обычный текст.

Заголовки ответа

JSON-объект с заголовками, которые добавятся к ответу:

{
  "Content-Type": "application/json",
  "X-Request-Id": "abc-123"
}

Задержка ответа (Response Delay)

Фиксированная задержка в миллисекундах перед отправкой ответа. Полезно для тестирования таймаутов и поведения при медленных внешних сервисах.

CORS

Если включено, к ответу автоматически добавляются CORS-заголовки и регистрируется OPTIONS preflight-маппинг:

Response Templating

Заглушка с Response Templating

При включённом шаблонизировании тело ответа обрабатывается движком Handlebars. Это позволяет создавать динамические ответы, которые зависят от данных запроса.

Доступные переменные

ВыражениеОписание
{{request.body}}Полное тело запроса
{{request.headers.X-Request-Id}}Значение заголовка запроса
{{request.query.page}}Значение query-параметра
{{request.path.[0]}}Сегмент пути (0 = первый сегмент)
{{request.method}}HTTP-метод запроса

Встроенные хелперы

ХелперПримерРезультат
now{{now format='yyyy-MM-dd HH:mm:ss'}}2026-04-16 14:30:00
randomValue{{randomValue type='UUID'}}a1b2c3d4-e5f6-...
randomValue{{randomValue length=8 type='ALPHANUMERIC'}}xK9mP2qL
jsonPath{{jsonPath request.body '$.user.name'}}Значение поля из JSON-тела
xPath{{xPath request.body '//name/text()'}}Значение из XML-тела
soapXPath{{soapXPath request.body '//MessageId/text()'}}Значение из SOAP-тела
math{{math 1 '+' 2}}3
randomInt{{randomInt lower=1 upper=1000}}Случайное число

Пример: эхо-сервер с метаданными

{
  "id": "{{randomValue type='UUID'}}",
  "received_at": "{{now format='yyyy-MM-dd\'T\'HH:mm:ss\'Z\''}}",
  "your_name": "{{jsonPath request.body '$.name'}}",
  "request_id": "{{request.headers.X-Request-Id}}",
  "method": "{{request.method}}"
}
Подробнее обо всех хелперах — в документации WireMock.

Fault Injection

Заглушка с Fault Injection

Симулирование сетевых ошибок для тестирования устойчивости вашего приложения. При включённом fault injection обычный ответ не отправляется — вместо него генерируется ошибка.

ТипПоведениеКогда полезно
connection_resetTCP-соединение сбрасывается (RST)Тестирование retry-логики, circuit breaker
empty_responseПустой ответ, соединение закрываетсяТестирование обработки пустых ответов
malformed_responseНевалидные HTTP-чанкиТестирование парсинга ответов
random_dataСлучайные байты, затем закрытиеТестирование обработки повреждённых данных
Важно: При fault injection тело ответа, заголовки, задержка и шаблонизирование игнорируются. Клиент получает только ошибку сети.

SOAP-заглушки

SOAP-заглушка

SOAP-заглушки позволяют мокировать веб-сервисы, работающие по SOAP 1.1 и 1.2. Они также работают через WireMock, но с дополнительными возможностями для XML и XPath.

Основные поля

ПолеОписание
Endpoint PathHTTP-путь, на котором принимаются SOAP-запросы. Пример: /frontend-service/MainService
SOAPActionЗначение заголовка SOAPAction для фильтрации. Матчит как с кавычками, так и без: "http://example.com/Send" и http://example.com/Send
SOAP Version1.1 — Content-Type: text/xml; 1.2 — Content-Type: application/soap+xml
WSDLЕсли заполнено, автоматически раздаётся по GET endpoint?wsdl

XPath Body Matchers

Мощный способ фильтрации SOAP-запросов по содержимому XML-тела. Задаётся как JSON-массив:

[
  {
    "xpath": "//*[local-name()='SendRequestRequest']",
    "equals": ""
  },
  {
    "xpath": "//*[local-name()='MessageType']",
    "equals": "CREATE"
  }
]

Два режима матчинга

Совет по namespace'ам: Используйте local-name() для игнорирования XML-пространств имён. Например: //*[local-name()='ElementName'] — сработает независимо от namespace.

Если несколько матчеров

Все матчеры в массиве должны совпасть (логика AND). Это позволяет точно выбрать нужный SOAP-метод.

Response Templating в SOAP

Работает так же, как для HTTP. Дополнительно доступен хелпер soapXPath:

<Response>
  <MessageId>{{soapXPath request.body '//MessageId/text()'}}</MessageId>
  <Timestamp>{{now format='yyyy-MM-dd HH:mm:ss'}}</Timestamp>
  <Status>SUCCESS</Status>
</Response>

Kafka-заглушки

Kafka-заглушка

Kafka-заглушки реализуют паттерн Request / Reply: приложение слушает входящий топик и автоматически отправляет ответ в указанный выходной топик.

Конфигурация

ПолеОбязательноеОписание
Request TopicДаТопик, из которого читаются входящие сообщения
Reply TopicДаТопик, в который отправляется ответ
Response KeyНетКлюч ответного сообщения. Если не задан — используется ключ входящего сообщения

Как работает

  1. При создании заглушки поднимается отдельный Kafka consumer с уникальным group ID
  2. Consumer слушает указанный Request Topic
  3. При получении сообщения — отправляет тело ответа заглушки в Reply Topic
  4. Заголовки из поля Response Headers добавляются к ответному сообщению
Group ID: Каждая заглушка получает уникальный consumer group, они не мешают друг другу.

Artemis-заглушки (JMS)

Заглушки для ActiveMQ Artemis. Слушают JMS-очередь и отправляют ответ в указанную очередь.

Конфигурация

ПолеОбязательноеОписание
Request QueueДаОчередь для входящих сообщений
Reply QueueДаОчередь для ответных сообщений
SelectorНетJMS selector для фильтрации сообщений (SQL-подобный синтаксис)
Response KeyНетПереопределение JMSCorrelationID. По умолчанию — берётся ID входящего сообщения

JMS Selector

Позволяет фильтровать входящие сообщения по свойствам JMS. Синтаксис аналогичен SQL WHERE:

JMSType = 'PaymentRequest'
priority > 5
country = 'RU' AND amount > 1000
Совет: Selector полезен, когда несколько заглушек слушают одну и ту же очередь, но должны реагировать на разные типы сообщений.

RabbitMQ-заглушки

Заглушки для RabbitMQ. Слушают AMQP-очередь и отправляют ответ в указанную очередь.

Конфигурация

ПолеОбязательноеОписание
Request QueueДаОчередь для входящих сообщений
Reply QueueДаОчередь для ответных сообщений
Response KeyНетПереопределение correlationId. По умолчанию — берётся из входящего сообщения

Очереди создаются автоматически (durable) при регистрации заглушки.

HTTP Schedule

Отложенные исходящие HTTP-вызовы. Заглушка отправляет HTTP-запрос по расписанию — в указанное время или по cron-выражению. Это не мок, а генератор исходящих запросов.

Типы расписания

Cron — повторяющееся

5-полевой cron: минута час день_месяца месяц день_недели

*/5 * * * *     — каждые 5 минут
0 9 * * 1-5     — в 09:00 по будням
0 0 1 * *       — первого числа каждого месяца в полночь
30 14 * * *     — каждый день в 14:30

Once — однократно

Выполняется один раз в указанное время. Формат: 2026-04-16T14:30:00 или ISO-8601 с timezone.

Внимание: Нельзя указать дату в прошлом — заглушка не будет создана.

Delay — с задержкой

Выполняется один раз через указанное количество минут от момента создания.

Конфигурация запроса

ПолеОписаниеПо умолчанию
Target URLURL, на который отправляется запрос
HTTP MethodGET, POST, PUT, PATCH, DELETEPOST
Content-Typeapplication/json, text/plain, text/xml, application/x-www-form-urlencodedapplication/json
Важно: В HTTP Schedule поля Response Body и Response Headers используются наоборот: Response Body — это тело отправляемого запроса, а Response Headers — это заголовки отправляемого запроса.

Создание заглушек

Через UI

Форма создания заглушки
  1. Перейдите в /ui/stubs и нажмите Создать
  2. Выберите протокол — форма автоматически покажет нужные поля
  3. Заполните обязательные поля (отмечены *)
  4. Заполните тело ответа — редактор автоматически определит формат (JSON/XML/Text)
  5. Нажмите Сохранить

Валидация

При выборе другого протокола форма автоматически показывает нужные поля:

Форма Kafka

Kafka

Форма SOAP

SOAP

Клонирование

Кнопка Клонировать в деталях заглушки создаёт копию с префиксом «Copy of». Копия создаётся выключенной. Удобно для создания вариаций одного сценария.

Включение / Выключение

Переключатель Enabled позволяет временно отключить заглушку, не удаляя её. Выключенная заглушка снимается с регистрации в WireMock / Kafka / Artemis и перестаёт отвечать на запросы.

Проекты и папки

Проекты

Заглушки можно объединять в проекты. Проект имеет код (уникальный) и имя. Фильтрация по проекту доступна в sidebar списка заглушек.

Папки

Иерархическая организация заглушек через путь-папку. Поддерживается вложенность через /:

payments
payments/auth
payments/auth/login
payments/refunds
orders
orders/v2

В sidebar отображается дерево папок с количеством заглушек в каждой. При клике на папку отображаются все заглушки в ней и её подпапках.

Импорт и экспорт

Экспорт

Импорт

Отправьте массив заглушек через POST /api/stubs/import:

curl -X POST http://<APP_HOST>:8080/api/stubs/import \
  -u <USER>:<PASSWORD> \
  -H "Content-Type: application/json" \
  -d @stubs-export.json
Важно: Все импортированные заглушки создаются в выключенном состоянии (enabled: false). Включите нужные вручную после проверки.

Формат файла

[
  {
    "name": "Get User",
    "integrationType": "sync",
    "protocol": "http",
    "config": {
      "method": "GET",
      "path": "/api/users/1",
      "status_code": 200
    },
    "responseBody": "{\"id\": 1, \"name\": \"John\"}",
    "responseHeaders": "{\"Content-Type\": \"application/json\"}",
    "enabled": true,
    "folder": "users"
  }
]

Сценарий: перенос между окружениями

  1. Экспортируйте заглушки из dev: GET /api/stubs/export
  2. Импортируйте в staging: POST /api/stubs/import
  3. Включите нужные заглушки

OpenAPI импорт

OpenAPI импорт

Автоматическое создание HTTP-заглушек из OpenAPI 3.x / Swagger 2.0 спецификации.

Как это работает

  1. Перейдите в /ui/stubs/import-openapi
  2. Вставьте OpenAPI-спецификацию (JSON или YAML)
  3. Система распарсит все эндпоинты и покажет превью
  4. Выберите нужные эндпоинты и нажмите «Создать»

Что извлекается автоматически

Все заглушки, созданные через OpenAPI импорт, создаются выключенными. Включите нужные после проверки конфигурации.

Метрики и журнал вызовов

Журнал вызовов и метрики

Каждая заглушка отслеживает вызовы и показывает метрики в разделе деталей.

Hit Counter

Счётчик количества срабатываний заглушки. Отображается в списке и в деталях. Сбрасывается при перезапуске приложения.

Журнал вызовов (Call Journal)

Журнал вызовов

Детальный лог каждого обращения к заглушке:

Графики

В деталях заглушки доступны:

Периоды: 5 мин, 15 мин, 30 мин, 1 час, 6 часов, 24 часа, 7 дней.

Поддержка по протоколам

ПротоколHit CounterЖурналURL/DestHTTP-методHTTP-статус
HTTP++URL++
SOAP++URL++
Kafka++Topic
Artemis++Queue
RabbitMQ++Queue
HTTP Schedule+

REST API

Все операции доступны через REST API на порту :8080. Авторизация: HTTP Basic Auth.

Endpoints

МетодURLОписание
POST/api/stubsСоздать заглушку
GET/api/stubsСписок заглушек (пагинация + фильтр)
GET/api/stubs/{id}Получить заглушку по ID
PUT/api/stubs/{id}Обновить заглушку
DELETE/api/stubs/{id}Удалить заглушку
GET/api/stubs/exportЭкспорт всех заглушек
GET/api/stubs/{id}/exportЭкспорт одной заглушки
POST/api/stubs/importИмпорт массива заглушек

Пагинация и фильтрация

GET /api/stubs?page=0&size=20&protocol=http

Параметры: page (с 0), size (по умолчанию 20), protocol (опционально).

Примеры curl

Создание HTTP-заглушки

curl -X POST http://<APP_HOST>:8080/api/stubs \
  -u <USER>:<PASSWORD> \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Get Users",
    "integrationType": "sync",
    "protocol": "http",
    "config": {
      "method": "GET",
      "path": "/api/users",
      "status_code": 200,
      "response_templating": false
    },
    "responseBody": "[{\"id\": 1, \"name\": \"John\"}]",
    "responseHeaders": "{\"Content-Type\": \"application/json\"}",
    "enabled": true
  }'

Создание Kafka-заглушки

curl -X POST http://<APP_HOST>:8080/api/stubs \
  -u <USER>:<PASSWORD> \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Payment Reply",
    "integrationType": "sync",
    "protocol": "kafka",
    "config": {
      "request_topic": "payment.requests",
      "reply_topic": "payment.replies"
    },
    "responseBody": "{\"status\": \"SUCCESS\", \"txId\": \"TX-001\"}",
    "enabled": true
  }'

Список с фильтром

curl http://<APP_HOST>:8080/api/stubs?protocol=kafka&page=0&size=10 \
  -u <USER>:<PASSWORD>

Конфигуратор развёртывания

Конфигуратор генерирует готовый набор файлов для развёртывания Badgermock под ваш проект. Вы выбираете нужные протоколы и параметры — получаете ZIP-архив со всем необходимым.

Ссылку на конфигуратор предоставляет ваш менеджер. Страница недоступна из навигации сайта и не индексируется поисковиками.

Что входит в архив

Состав архива зависит от выбранной среды развёртывания:

ФайлDocker ComposeKubernetesStandalone
.env+
docker-compose.yml+
helm/Chart.yaml+
helm/values.yaml+
helm/templates/*.yaml+
badgermock.env+
badgermock.service+
Dockerfile+++
README.md+++
badgermock.jarопциональноопциональноопционально

Как пользоваться

  1. Выберите протоколы — отметьте только те, которые реально используются на проекте. HTTP включён всегда. Отключённые протоколы не будут приниматься приложением, а в Docker Compose не будут подниматься лишние брокеры.
  2. Настройте параметры — порт приложения (8080) и порт WireMock (18080). Эти порты влияют на Dockerfile, docker-compose.yml, Ingress и переменную APPLICATION_STUBS_BASE_URL (от неё зависят curl-примеры в UI).
  3. Заполните настройки протоколов — при включении Kafka, Artemis или RabbitMQ появятся дополнительные поля: bootstrap servers, broker URL, security protocol и т.д.
  4. Выберите среду — Docker Compose, Kubernetes или Standalone (VM).
  5. Скачайте архив — опционально можно включить badgermock.jar (~106 MB).

Docker Compose

Генерируется docker-compose.yml с сервисами:

Запуск: положите badgermock.jar рядом с Dockerfile, соберите образ и запустите:

docker build -t badgermock .
BADGERMOCK_IMAGE=badgermock docker compose up -d

Kubernetes (Helm)

Генерируется полноценный Helm-чарт:

Ingress: два хоста

Ingress настраивается на два домена:

ХостНазначениеПорт
ingress.app.hostUI + REST APIservice.port (8080)
ingress.wiremock.hostHTTP/SOAP заглушкиservice.wiremockPort (18080)

APPLICATION_STUBS_BASE_URL автоматически формируется из ingress.wiremock.host — curl-примеры в UI будут корректными.

Деплой:

# Сборка образа
docker build -t registry.example.com/badgermock:latest .
docker push registry.example.com/badgermock:latest

# Секрет для БД
kubectl create secret generic badgermock-db-secret \
  --from-literal=SPRING_DATASOURCE_PASSWORD=<PASSWORD>

# Установка
helm upgrade --install badgermock ./helm/ -f helm/values.yaml

Standalone (VM)

Генерируется пара файлов для запуска через systemd:

Установка:

cp badgermock.jar /opt/badgermock/
cp badgermock.env /etc/badgermock/
cp badgermock.service /etc/systemd/system/
systemctl daemon-reload
systemctl start badgermock

Переопределение конфигурации

JAR всегда один и тот же — все протоколы включены внутри. Конфигуратор генерирует только внешнюю обвязку (env-файлы, docker-compose, Helm values). Spring Boot применяет приоритеты:

  1. Переменные окружения — наивысший приоритет (перекрывают всё)
  2. application.yml рядом с JAR — средний приоритет
  3. application.yml внутри JAR — дефолты

Это значит: вы можете изменить любой параметр после генерации, просто отредактировав .env / values.yaml — без пересборки JAR.

Конфигурация

Feature Flags

Каждый протокол можно включить или выключить. Выключенный протокол не отображается в UI и не принимает запросы на создание заглушек.

Переменная окруженияОписаниеПо умолчанию
APPLICATION_FEATURES_HTTP_ENABLEDHTTP-заглушки (WireMock)true
APPLICATION_FEATURES_SOAP_ENABLEDSOAP-заглушкиtrue
APPLICATION_FEATURES_KAFKA_ENABLEDKafka-заглушкиtrue
APPLICATION_FEATURES_ARTEMIS_ENABLEDArtemis-заглушкиtrue
APPLICATION_FEATURES_RABBIT_ENABLEDRabbitMQ-заглушкиfalse
APPLICATION_FEATURES_HTTP_SCHEDULE_ENABLEDHTTP Scheduletrue
APPLICATION_FEATURES_HTTP_WIREMOCK_PORTПорт WireMock-сервера18080

Таймауты

Переменная окруженияОписаниеПо умолчанию
APPLICATION_TIMEOUTS_KAFKA_PRODUCERТаймаут Kafka producer (секунды)10
APPLICATION_TIMEOUTS_ARTEMIS_RECOVERYИнтервал восстановления JMS (мс)10000
APPLICATION_TIMEOUTS_RABBIT_RECOVERYИнтервал восстановления RabbitMQ (мс)10000
APPLICATION_TIMEOUTS_HTTP_SCHEDULE_CONNECTТаймаут подключения HTTP Schedule (сек)5
APPLICATION_TIMEOUTS_HTTP_SCHEDULE_READТаймаут чтения HTTP Schedule (сек)5

Брендинг

Кастомизация внешнего вида UI:

Переменная окруженияОписаниеПо умолчанию
APPLICATION_BRANDING_NAMEНазвание в шапке UIBadgermock
APPLICATION_BRANDING_DESCRIPTIONОписаниеСервис интеграционных стабов
APPLICATION_BRANDING_ICONПуть к иконке/images/badger-icon.svg

Подключения

Переменная окруженияОписание
SPRING_DATASOURCE_URLJDBC URL для PostgreSQL
SPRING_DATASOURCE_USERNAMEПользователь БД
SPRING_DATASOURCE_PASSWORDПароль БД
SPRING_KAFKA_BOOTSTRAP_SERVERSKafka bootstrap servers
SPRING_ARTEMIS_BROKER_URLURL Artemis брокера
SPRING_RABBITMQ_HOSTХост RabbitMQ
SERVER_PORTПорт приложения (по умолчанию 8080)

Безопасность

Аутентификация

Пользователи

Учётные данные задаются при развёртывании. Для настройки через переменные окружения:

APPLICATION_SECURITY_USER=myuser
APPLICATION_SECURITY_PASSWORD=mypassword

Отключение авторизации

APPLICATION_SECURITY_ENABLED=false

Все эндпоинты становятся доступны без авторизации. Подходит для dev-окружений.

Health Check

curl http://<APP_HOST>:8080/actuator/health

Доступен без авторизации. Используется для liveness/readiness probes в Kubernetes.