Configuración de WireMock¶
Descripción¶
WireMock es un servicio de mock para APIs que permite simular endpoints HTTP durante el desarrollo y testing. Incluye una interfaz gráfica para gestionar los mocks de manera visual.
Configuración en Docker Compose¶
wiremock:
image: holomekc/wiremock-gui
container_name: wiremock
ports:
- "8080:8080"
volumes:
- ./wiremock/mappings:/home/wiremock/mappings
- ./wiremock/__files:/home/wiremock/__files
command: ["--verbose", "--global-response-templating"]
environment:
VIRTUAL_HOST: wiremock.seekdev.com
VIRTUAL_PORT: 8080
LETSENCRYPT_HOST: wiremock.seekdev.com
LETSENCRYPT_EMAIL: jgarcia@seek.pe
Acceso¶
- URL: https://wiremock.seekdev.com
- Puerto interno: 8080
- Interfaz gráfica: Disponible en la URL principal
Estructura de Archivos¶
wiremock/
├── mappings/ # Definiciones de mocks
│ ├── api-users.json
│ └── api-products.json
└── __files/ # Archivos de respuesta
├── users.json
└── products.json
Creación de Mocks¶
Ejemplo de Mapping¶
{
"request": {
"method": "GET",
"url": "/api/users"
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"bodyFileName": "users.json"
}
}
Respuesta con Template¶
{
"request": {
"method": "POST",
"url": "/api/users",
"bodyPatterns": [
{
"matchesJsonPath": "$.name"
}
]
},
"response": {
"status": 201,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"id": "{{randomValue length=8 type='ALPHANUMERIC'}}",
"name": "{{jsonPath request.body '$.name'}}",
"created": "{{now format='yyyy-MM-dd'}}"
}
}
}
Uso en Desarrollo¶
Configuración de Cliente¶
// Configuración para desarrollo
const API_BASE_URL = process.env.NODE_ENV === 'development'
? 'https://wiremock.seekdev.com'
: 'https://api.production.com';
Testing¶
// Ejemplo con Jest
describe('User API', () => {
beforeEach(() => {
// Configurar WireMock para el test
fetch('https://wiremock.seekdev.com/__admin/mappings', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(mockMapping)
});
});
test('should create user', async () => {
const response = await fetch(`${API_BASE_URL}/api/users`, {
method: 'POST',
body: JSON.stringify({ name: 'John Doe' })
});
expect(response.status).toBe(201);
});
});
Características Avanzadas¶
Response Templating¶
WireMock soporta templates para respuestas dinámicas:
{{randomValue}}: Valores aleatorios{{now}}: Fechas y horas{{jsonPath}}: Extracción de datos del request{{request}}: Acceso a datos del request
Scenarios¶
{
"scenarioName": "User Creation Flow",
"requiredScenarioState": "Started",
"newScenarioState": "User Created",
"request": {
"method": "POST",
"url": "/api/users"
},
"response": {
"status": 201,
"jsonBody": {
"message": "User created successfully"
}
}
}
Monitoreo¶
WireMock está integrado con el stack de monitoreo:
- Logs: Disponibles en el contenedor
- Métricas: HTTP requests y responses
- Alertas: Para fallos en el servicio
Mejores Prácticas¶
- Organización: Mantener mappings organizados por dominio
- Documentación: Documentar cada mock con su propósito
- Versionado: Mantener versiones de los mappings
- Testing: Validar que los mocks funcionan correctamente
- Cleanup: Limpiar mocks no utilizados