Por Que Mockear APIs?
El mocking de API crea versiones simuladas de APIs reales que retornan respuestas predefinidas. Es esencial en desarrollo moderno porque:
Escenarios Comunes para Mocking
- API de terceros no disponible — el sandbox del proveedor de pagos esta caido, pero necesitas testear checkout
- API en desarrollo — el equipo de backend no ha terminado el endpoint
- Reduccion de costos — llamar APIs de pago miles de veces es costoso
- Testing deterministico — APIs reales pueden retornar datos diferentes; mocks retornan datos consistentes
- Simulacion de edge cases — dificil provocar un 500 en una API real; mocks pueden simular cualquier respuesta
- Testing de performance — simular respuestas lentas, timeouts y errores de red
- Desarrollo offline — desarrolladores pueden trabajar sin conectividad
Stubs vs. Mocks vs. Fakes
| Termino | Definicion | Ejemplo |
|---|---|---|
| Stub | Retorna respuestas predefinidas | Retorna {id: 1, name: "Alice"} para cualquier GET /users/1 |
| Mock | Stub + verifica expectativas | Igual al stub, pero verifica que el request se hizo exactamente una vez |
| Fake | Implementacion simplificada | Base de datos en memoria en vez de PostgreSQL real |
Introduccion a WireMock
WireMock es la herramienta de mocking de API mas popular en el ecosistema Java, pero funciona con cualquier lenguaje via su API HTTP o servidor standalone.
Ejecutando WireMock
Standalone:
java -jar wiremock-standalone-3.3.1.jar --port 8080
Docker:
docker run -d -p 8080:8080 wiremock/wiremock:latest
Creando Tu Primer Stub
{
"request": {
"method": "GET",
"url": "/api/users/1"
},
"response": {
"status": 200,
"headers": {"Content-Type": "application/json"},
"jsonBody": {
"id": 1,
"name": "Alice Johnson",
"email": "alice@example.com"
}
}
}
Via API HTTP:
curl -X POST http://localhost:8080/__admin/mappings -d '{
"request": {"method": "GET", "urlPattern": "/api/users/[0-9]+"},
"response": {"status": 200, "jsonBody": {"id": 1, "name": "Alice"}}
}'
Request Matching
URL Matching
{"url": "/api/users/1"} // Match exacto
{"urlPattern": "/api/users/[0-9]+"} // Match regex
{"urlPathPattern": "/api/users/.*"} // Patron de path
Header y Body Matching
WireMock soporta matching sofisticado de headers, query parameters y body usando JSON paths y patrones regex.
Funcionalidades Avanzadas de WireMock
Simulando Delays
{
"request": {"method": "GET", "url": "/api/slow"},
"response": {
"status": 200,
"fixedDelayMilliseconds": 3000,
"jsonBody": {"data": "respuesta tardada"}
}
}
Simulando Errores
{
"request": {"method": "GET", "url": "/api/error"},
"response": {"status": 500, "jsonBody": {"error": "Internal Server Error"}}
}
{
"request": {"method": "GET", "url": "/api/timeout"},
"response": {"fault": "CONNECTION_RESET_BY_PEER"}
}
Comportamiento Stateful (Escenarios)
Mockear diferentes respuestas basadas en estado:
[
{
"scenarioName": "Ciclo de usuario",
"requiredScenarioState": "Started",
"newScenarioState": "Usuario creado",
"request": {"method": "POST", "url": "/api/users"},
"response": {"status": 201, "jsonBody": {"id": 1, "name": "Alice"}}
},
{
"scenarioName": "Ciclo de usuario",
"requiredScenarioState": "Usuario creado",
"request": {"method": "GET", "url": "/api/users/1"},
"response": {"status": 200, "jsonBody": {"id": 1, "name": "Alice"}}
}
]
Verificacion de Requests
curl http://localhost:8080/__admin/requests/count -d '{
"method": "POST", "url": "/api/users"
}'
# Response: {"count": 1}
Response Templating
Respuestas dinamicas basadas en datos del request con placeholders.
Estrategias de Mocking
Patron de Virtualizacion de Servicios
Para microservicios, mockea dependencias externas mientras mantienes componentes internos reales.
Mock en CI/CD
services:
wiremock:
image: wiremock/wiremock:latest
ports: ["8080:8080"]
volumes: ["./tests/mocks:/home/wiremock"]
Alternativas a WireMock
| Herramienta | Lenguaje | Mejor Para |
|---|---|---|
| WireMock | Java/Cualquiera | Enterprise, matching complejo |
| json-server | Node.js | Mock rapido desde archivo JSON |
| Prism | Cualquiera | Auto-mock desde spec OpenAPI |
| MSW | JavaScript | Intercepcion en browser/Node.js |
| Mountebank | Cualquiera | Multi-protocolo (HTTP, TCP, SMTP) |
Ejercicio Practico
- Configura WireMock: Ejecuta standalone o via Docker. Crea stubs para GET, POST y DELETE.
- Request matching: Crea stubs que respondan diferente segun query params, headers y body.
- Simula fallas: Crea stubs para errores 500, timeouts y resets de conexion.
- Verifica requests: Usa la API de verificacion para confirmar que tu cliente hizo los requests esperados.
- Mock stateful: Crea un escenario donde POST crea un recurso y GET subsecuente lo retorna.
Puntos Clave
- El mocking de API simula comportamiento real para testing cuando la API esta no disponible o es impredecible
- WireMock es la herramienta estandar — soporta request matching, templating, delays, faults y escenarios stateful
- Stubs retornan respuestas predefinidas; mocks agregan verificacion de que se hicieron los requests esperados
- Usa mocking para APIs de terceros, APIs en desarrollo, simulacion de edge cases e integracion CI/CD
- Response templating y escenarios stateful permiten comportamiento mock realista