24. Cuándo usar componentes reales y cuándo simular dependencias

24.1 Introducción

Una decisión central en pruebas de integración es elegir qué dependencias serán reales y cuáles serán simuladas. Esta decisión afecta la confianza, la velocidad, la estabilidad y la facilidad para diagnosticar fallas.

Usar todo real puede parecer ideal, pero no siempre es práctico. Simular todo puede ser rápido, pero puede ocultar errores de integración importantes. El objetivo es encontrar un equilibrio razonable según el riesgo que se quiere cubrir.

En este tema veremos criterios para decidir cuándo usar componentes reales y cuándo reemplazar dependencias por stubs, fakes o servicios simulados.

24.2 La pregunta principal

Antes de decidir, conviene formular una pregunta concreta:

¿Qué colaboración quiero verificar en esta prueba y qué dependencias forman parte real de ese riesgo?

Si una dependencia es parte del riesgo que queremos cubrir, probablemente convenga usarla de forma real o muy representativa. Si no forma parte del objetivo, puede ser razonable simularla para mantener la prueba controlada.

24.3 Ventajas de usar componentes reales

Usar componentes reales aumenta el realismo de la prueba. Permite detectar errores que una simulación podría ocultar.

Ventajas:

  • Verifica contratos reales.
  • Detecta errores de configuración.
  • Revela problemas de datos, permisos o esquemas.
  • Aumenta la confianza en el comportamiento integrado.
  • Reduce el riesgo de que una simulación esté desactualizada.

Por ejemplo, probar un repositorio contra una base de datos real de prueba puede detectar errores de SQL, migraciones o restricciones que un fake no mostraría.

24.4 Riesgos de usar componentes reales

El realismo tiene costo. Usar dependencias reales puede volver la prueba más lenta o frágil.

Riesgos:

  • Mayor tiempo de ejecución.
  • Necesidad de preparar más ambiente.
  • Fallas por disponibilidad de servicios.
  • Costos o límites de uso.
  • Efectos secundarios no deseados.
  • Diagnóstico más complejo si intervienen muchas partes.

Una prueba que falla por una dependencia que no era el objetivo puede generar ruido y pérdida de confianza en la suite.

24.5 Ventajas de simular dependencias

Simular dependencias permite controlar mejor el escenario de prueba. Esto es útil cuando necesitamos respuestas específicas, errores concretos o condiciones difíciles de provocar.

Ventajas:

  • Mayor velocidad.
  • Mayor estabilidad.
  • Control de respuestas exitosas y fallidas.
  • Ausencia de costos o efectos reales.
  • Facilidad para probar timeouts, rechazos y errores raros.
  • Menor preparación de ambiente.

Por ejemplo, simular una pasarela de pagos permite probar pagos aprobados, rechazados y timeouts sin realizar operaciones reales.

24.6 Riesgos de simular dependencias

El principal riesgo de simular es que la simulación no represente bien el comportamiento real. Entonces la prueba puede pasar aunque la integración real falle.

Riesgos:

  • Contrato desactualizado.
  • Respuestas demasiado simples.
  • Errores reales no representados.
  • Falsa confianza sobre la integración.
  • Demasiadas dependencias simuladas, reduciendo el valor de la prueba.

Simular no es un problema en sí. El problema es simular sin mantener el doble alineado con el riesgo real.

24.7 Criterio 1: objetivo de la prueba

El objetivo de la prueba debe guiar la decisión.

Ejemplos:

  • Si queremos probar persistencia, conviene usar una base de datos real de prueba.
  • Si queremos probar manejo de pago rechazado, puede convenir simular el proveedor de pagos.
  • Si queremos probar que se publica un evento, puede no hacer falta ejecutar el consumidor real.
  • Si queremos probar el flujo completo de un proceso asíncrono, puede convenir incluir productor, cola y consumidor.

Una dependencia real aporta valor cuando participa directamente en la colaboración que estamos verificando.

24.8 Criterio 2: riesgo de la dependencia

Si una dependencia es fuente frecuente de errores o tiene impacto alto, conviene probarla con más realismo.

Señales de dependencia riesgosa:

  • Contrato cambiante.
  • Datos complejos.
  • Errores frecuentes en producción.
  • Alta importancia para el negocio.
  • Configuración difícil.
  • Reglas compartidas con varios componentes.

Cuanto mayor es el riesgo, más cuidado debemos tener al decidir simular.

24.9 Criterio 3: estabilidad y disponibilidad

Una dependencia inestable puede hacer que las pruebas fallen sin cambios en el código. Si eso ocurre con frecuencia, el equipo puede dejar de confiar en la suite.

Puede convenir simular cuando:

  • El servicio real se cae con frecuencia.
  • La red no es confiable.
  • La dependencia pertenece a un tercero.
  • El ambiente compartido se modifica sin control.
  • La dependencia no está disponible para ejecución local.

También puede ser útil tener pocas pruebas con la dependencia real y más pruebas con simulación controlada.

24.10 Criterio 4: costo y efectos secundarios

Algunas dependencias tienen costos o efectos reales. En esos casos, simular puede ser la decisión más segura para pruebas frecuentes.

Ejemplos:

  • Pagos reales.
  • Envío de correos o SMS a usuarios.
  • Emisión de facturas.
  • Reservas reales.
  • Operaciones con sistemas legales o financieros.

Si se usa un servicio real, debe ser en ambiente de prueba o sandbox y con datos controlados.

24.11 Criterio 5: facilidad de diagnóstico

Una prueba debe ayudar a encontrar la causa cuando falla. Si se incluyen demasiadas dependencias reales, el diagnóstico puede volverse lento.

Conviene simular una dependencia cuando:

  • No es parte del riesgo principal.
  • Sus fallas dificultan interpretar la prueba.
  • Ya está cubierta por pruebas específicas.
  • La prueba busca aislar la colaboración entre otras partes.

Un buen alcance hace que una falla señale con claridad qué integración se rompió.

24.12 Criterio 6: velocidad de ejecución

Las pruebas de integración deben aportar confianza, pero también deben poder ejecutarse con una frecuencia razonable. Si una suite tarda demasiado, el equipo la ejecutará menos.

Puede ser útil organizar pruebas en grupos:

  • Pruebas rápidas con dependencias simuladas para ejecución frecuente.
  • Pruebas con componentes reales principales para validación más profunda.
  • Pruebas con sistemas externos reales o sandbox para ejecución menos frecuente y controlada.

No todas las pruebas tienen que ejecutarse con la misma frecuencia.

24.13 Decisiones típicas

La siguiente tabla muestra decisiones habituales:

Dependencia Usar real cuando... Simular cuando...
Base de datos Se prueba persistencia, consultas o transacciones. El objetivo no depende del almacenamiento real.
API externa Se valida contrato real en sandbox. Se prueban errores, timeouts o casos frecuentes localmente.
Correo Se valida configuración real de envío en ambiente controlado. Solo se necesita verificar que se solicitó el envío correcto.
Cola Se prueba publicación y consumo real. Solo se necesita verificar que se intenta publicar un evento.
Servicio interno El contrato y comportamiento real son parte del riesgo. El servicio no está disponible o no es el foco del caso.

24.14 Estrategia mixta

En proyectos reales, lo más común es usar una estrategia mixta. Algunas pruebas usan dependencias reales y otras usan simulaciones.

Por ejemplo, para compras:

  • Usar base de datos real de prueba para órdenes y stock.
  • Simular proveedor de pagos para aprobar, rechazar y generar timeout.
  • Usar correo falso para capturar notificaciones.
  • Ejecutar pocas pruebas contra sandbox de pagos para validar contrato real.

Esta combinación permite cubrir riesgos importantes sin volver todas las pruebas lentas o frágiles.

24.15 Documentar la decisión

La prueba debe dejar claro qué componentes son reales y cuáles están simulados. Esto evita interpretar mal su cobertura.

Conviene documentar:

  • Qué dependencias participan realmente.
  • Qué dependencias fueron reemplazadas.
  • Qué comportamiento simula cada doble.
  • Qué riesgo cubre la prueba.
  • Qué riesgo queda fuera de esa prueba.

Una prueba clara no promete más de lo que realmente verifica.

24.16 Ejemplo: registro de usuario

Para probar el registro de usuario, podríamos tomar estas decisiones:

Componente Decisión Motivo
Controlador Real Queremos validar entrada y respuesta.
Servicio de usuarios Real Contiene la regla de registro.
Base de datos Real de prueba Queremos verificar persistencia y duplicados.
Correo Fake Queremos verificar solicitud de envío sin mandar correo real.

24.17 Errores comunes

Al decidir entre componentes reales y simulados, suelen aparecer errores como:

  • Usar todo real y crear pruebas lentas e inestables.
  • Simular todo y no probar integración real.
  • No actualizar simulaciones cuando cambia el contrato.
  • No documentar qué se reemplazó.
  • Usar una dependencia real que produce efectos peligrosos.
  • Simular una dependencia que era justamente el riesgo principal.
  • No tener ninguna prueba contra el contrato real de una dependencia crítica.

24.18 Lista de verificación

Antes de decidir, conviene revisar:

  • ¿Cuál es el objetivo exacto de la prueba?
  • ¿Qué dependencia forma parte del riesgo principal?
  • ¿Qué dependencia puede quedar fuera sin perder valor?
  • ¿Usar el componente real genera costo, lentitud o inestabilidad?
  • ¿La simulación respeta el contrato importante?
  • ¿Existe al menos alguna validación contra el comportamiento real si la dependencia es crítica?
  • ¿La prueba deja claro qué cubre y qué no cubre?

24.19 Qué debes recordar de este tema

  • Usar componentes reales aumenta realismo, pero también costo y complejidad.
  • Simular dependencias aumenta control, pero puede ocultar diferencias reales.
  • La decisión depende del objetivo y del riesgo de la prueba.
  • Las dependencias críticas deben probarse con suficiente realismo en algún nivel.
  • Una estrategia mixta suele ser más práctica que usar siempre todo real o siempre todo simulado.
  • Es importante documentar qué dependencias fueron reemplazadas.

24.20 Conclusión

Decidir entre componentes reales y dependencias simuladas es una cuestión de equilibrio. Una buena prueba de integración debe ser lo bastante realista para detectar errores importantes y lo bastante controlada para ser repetible y diagnosticable.

El criterio principal siempre debe ser el objetivo de la prueba: qué colaboración queremos verificar y qué dependencias forman parte de ese riesgo.

En el próximo tema veremos cómo diseñar casos de prueba de integración.