Mountebank – Respuestas proxy

En este artículo vamos a ver el uso de otro de los tipos de respuestas que provee Mountebank, las respuestas de tipo proxy, espero que os guste y/o sirva de ayuda en vuestros tests.

Aquí tienes la serie completa de tutoriales sobre Mountebank:

Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 15′ (2,3 Ghz Intel Core i7, 16GB DDR4).
  • Sistema Operativo: Mac OS Catalina 10.15.5
  • Entorno de desarrollo: JDK 11, IntelliJ, Docker, Postman

 

Introducción

En este artículo vamos a ver el uso de otro de los tipos de respuestas que provee Mountebank, las respuestas de tipo proxy, espero que os guste y/o sirva de ayuda en vuestros tests.

Este artículo está dividido en 6 partes:

  • Respuestas de tipo proxy
  • Creación de predicados con predicateGenerators
  • Capturar múltiples respuestas
  • Proxy “transparente”
  • Proxy “parciales”
  • Conclusiones

 

Respuestas de tipo proxy

Los impostores de tipo proxy se configuran para ir directamente a la fuente real, nos permite poner a un impostor mountebank entre el sistema bajo prueba y un servicio real del que depende, esta disposición permite capturar datos reales que se pueden reproducir en pruebas, en lugar de crearlos manualmente utilizando respuestas enlatadas. 

Mountebank expone el estado actual de cada impostor a través de la API, si enviamos una solicitud GET a http://localhost:2525/imposters/80, se puede ver la respuesta guardada.

Mountebank registra el tiempo que se tarda en llamar al servicio real en el campo proxyResponseTime, que podemos usar para agregar latencia simulada durante la prueba de rendimiento.

El comportamiento por defecto de un proxy (definido por el modo proxyOnce) es llamar al servicio de bajada la primera vez que ve una petición que no reconoce, y desde ese punto en adelante enviar la respuesta guardada de vuelta para futuras peticiones que se vean similares.

{
    "port": 80,
    "protocol": "http",
    "stubs": [
        {
            "responses": [
                {
                    "proxy": {
                        "to": "http://api.autentia.com"
                    },
                    "mode": "proxyOnce"
                }
            ]
        }
    ]
}

 

Creación de predicados con predicateGenerators

Los predicateGenerators son los responsables de crear los predicados sobre las respuestas guardadas. Los predicados generados utilizan deepEquals para la mayoría de los casos. 

El campo predicateGenerators refleja fielmente el campo predicates estándar y acepta todos los mismos parámetros. Cada objeto en la matriz predicateGenerators genera un objeto correspondiente en la matriz de predicados del stub recién creado.

Vamos a verlo con un ejemplo, para ello vamos a definir el siguiente impostor.

{
    ...
    "proxy": {
        "to": "http://api.autentia.com/...",
        "predicateGenerators": [
            {
                "matches": {
                    "query": true
                },
                "caseSensitive": true
            }
        ]
    }
}

El siguiente fragmento de código refleja cómo se vería el predicado generado por Mountbank y almacenado para las siguientes peticiones que se realicen.

...
"stubs": [
    {
        "predicates": [
            {
                "caseSensitive": true,
                "deepEquals": {
                    "query": {
                        "q": "mountebank",
                        "page": "1"
                    }
                }
            }
        ],
        "responses": [
            {
                "is": { ...
                }
            }
        ]
    },
...

 

Capturar múltiples respuestas

Hasta ahora hemos visto la opción por defecto de Mountebank, tal y como hemos comentado anteriormente, proxyOnce, que es llamar al servicio de bajada la primera vez que ve una petición que no reconoce pero ¿cómo haríamos si tuviéramos un caso de prueba que se basará en la volatilidad del inventario a lo largo del tiempo?, necesitaríamos un proxy que nos permitiera capturar un conjunto de datos más rico o más voluminoso para reproducirlo posteriormente, por ejemplo en unas pruebas de carga. 

El modo proxyAlways se asegura que todas las solicitudes lleguen al servicio real, lo que nos permite capturar múltiples respuestas para un único tipo de solicitud. Crear este tipo de proxy es tan simple como establecer el modo proxyAlways.

La diferencia clave entre proxyOnce y proxyAlways, es que proxyOnce genera los nuevos stubs antes del stub que contiene la respuesta de tipo proxy, mientras que proxyAlways genera los stubs después del stub del proxy.

{
    "port": 80,
    "protocol": "http",
    "stubs": [
        {
            "responses": [
                {
                    "proxy": {
                        "to": "http://api.autentia.com/..."
                    },
                    "mode": "proxyAlways",
                    "predicateGenerators": [
                        {
                            "matches": {
                                "path": true
                            }
                        }
                    ]
                }
            ]
        }
    ]
}

 

Proxy “transparente”

Mountebank provee de un modo más de proxy, el modo “proxyTransparent” que al igual que el modo proxyAlways se asegura que todas las solicitudes lleguen al servicio real, pero a diferencia de éste no guarda las respuestas que recibe del servicio real.

 

Proxy “parciales”

Mountebank también proporciona lo que denomina como proxy parcial, donde la mayoría de las llamadas fluyen a través del servicio real, pero unas pocas solicitudes especiales desencadenan respuestas enlatadas. Fijaos que el proxy no tiene predicados, lo que significa que todas las peticiones que no coincidan con los predicados en los stubs anteriores fluirán a través del proxy.

{
    ...
    "stubs": [
        {
            "predicates": [
                {
                    "contains": {
                        "body": "5555555555555555"
                    }
                }
            ],
            "responses": [
                {
                    "is": {
                        "body": "FRAUD ALERT... "
                    }
                }
            ]
        },
        {
            "predicates": [
                {
                    "contains": {
                        "body": "4444444444444444"
                    }
                }
            ],
            "responses": [
                {
                    "is": {
                        "body": "INSUFFICIENT FUNDS..."
                    }
                }
            ]
        },
        {
            "responses": [
                {
                    "proxy": {
                        "to": "http://api.autentia.com/...",
                        "mode": "proxyAlways"
                    }
                }
            ]
        }
    ]
    ...
}

 

Conclusiones

En este artículo hemos repasado qué son y cómo podemos utilizar los tipos de respuesta proxy que proporciona Mountebank para capturar las respuestas reales y guardar sus respuestas para su reproducción futura.

Puedes descargar el proyecto completo aquí.

 

Referencias

http://www.mbtest.org/

https://github.com/bbyars/mountebank

https://github.com/bbyars/mountebank-in-action

https://hub.docker.com/r/bbyars/mountebank

http://www.mbtest.org/docs/api/proxies

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Consultor tecnológico de desarrollo de proyectos informáticos.
Puedes encontrarme en Autentia: ofrecemos servicios de soporte a desarrollo, factoría y formación. Somos expertos en Java/Java EE.

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

22/06/2026

Juan Antonio Jiménez Torres

Vamos a instrumentalizar un SDD para un microservicio bancario. En este artículo sobre SDD - Spec Driven Development, instrumentalizado sobre OpenSpec vamos a construir una PoC de algo más serio que una tabla periódica. Un microservicio bancario muy simplificado que gestione cuentas y permita hacer transferencias

16/06/2026

Juan Antonio Jiménez Torres

Este es el segundo artículo sobre SDD, Spec Driven Development, instrumentalizado sobre OpenSpec. Pero esta vez nos acercaremos usando softwere gratuito. Por un lado OpenCode en lugar de ClaudeCode y usando el modelo gratuito Gemma4 de Google en lugar de otros de pago.

08/06/2026

Juan Antonio Jiménez Torres

Aprenderemos sobre SDD – Spec Driven Development instrumentalizado sobre OpenSpec. Haremos un primer acercamiento usando ClaudeCode con Sonnet, para luego, en un artículo posterior pasarnos a la versión gratuita de OpenCode con Gemma4