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

  1. API de terceros no disponible — el sandbox del proveedor de pagos esta caido, pero necesitas testear checkout
  2. API en desarrollo — el equipo de backend no ha terminado el endpoint
  3. Reduccion de costos — llamar APIs de pago miles de veces es costoso
  4. Testing deterministico — APIs reales pueden retornar datos diferentes; mocks retornan datos consistentes
  5. Simulacion de edge cases — dificil provocar un 500 en una API real; mocks pueden simular cualquier respuesta
  6. Testing de performance — simular respuestas lentas, timeouts y errores de red
  7. Desarrollo offline — desarrolladores pueden trabajar sin conectividad

Stubs vs. Mocks vs. Fakes

TerminoDefinicionEjemplo
StubRetorna respuestas predefinidasRetorna {id: 1, name: "Alice"} para cualquier GET /users/1
MockStub + verifica expectativasIgual al stub, pero verifica que el request se hizo exactamente una vez
FakeImplementacion simplificadaBase 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

HerramientaLenguajeMejor Para
WireMockJava/CualquieraEnterprise, matching complejo
json-serverNode.jsMock rapido desde archivo JSON
PrismCualquieraAuto-mock desde spec OpenAPI
MSWJavaScriptIntercepcion en browser/Node.js
MountebankCualquieraMulti-protocolo (HTTP, TCP, SMTP)

Ejercicio Practico

  1. Configura WireMock: Ejecuta standalone o via Docker. Crea stubs para GET, POST y DELETE.
  2. Request matching: Crea stubs que respondan diferente segun query params, headers y body.
  3. Simula fallas: Crea stubs para errores 500, timeouts y resets de conexion.
  4. Verifica requests: Usa la API de verificacion para confirmar que tu cliente hizo los requests esperados.
  5. 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