Introducción: por qué sin mocks y fixtures las pruebas son una lotería
\n\nImagine que está escribiendo código para una nave espacial. Su función calcula la trayectoria, accediendo al módulo de control del motor. ¿Cómo verificar que la trayectoria es correcta sin encender el motor real? En el mundo real, eso es un desastre. En el mundo de C++, es una tarea para objetos mock y fixtures.
\n\nSi alguna vez ha escrito pruebas unitarias en C++, seguramente se ha enfrentado a problemas: la prueba falla debido a la red, la base de datos o el sistema de archivos. O gasta 10 líneas preparando datos para cada verificación. ¿Le suena familiar? Entonces este artículo es para usted.
\n\nAnalizaremos cómo los objetos mock en C++ ayudan a aislar el código del mundo exterior, y los fixtures permiten reutilizar la configuración de las pruebas. Sin rodeos, solo código y práctica. ¡Allá vamos!
\n\n¿Qué son los objetos mock y por qué se necesitan en C++?
\n\nUn objeto mock (o simplemente mock) es un reemplazo de un objeto real que imita su comportamiento. Usted le dice al mock: «Cuando se llame al método getData(), devuelve 42». Y él obedientemente devuelve 42, sin acceder a la base de datos, API o archivo.
\n\nEn C++, los mocks son especialmente importantes porque el lenguaje no perdona errores. Si su clase depende de la red y la red falla, la prueba fallará, aunque su código sea perfecto. Los mocks resuelven este problema: aislan el código bajo prueba.
\n\nEscenarios principales de uso de objetos mock en C++:
\n- \n
- Servicios externos (bases de datos, API REST, archivos). \n
- Cálculos complejos que ralentizan las pruebas (criptografía, renderizado). \n
- Funciones no deterministas (rand(), time()). \n
- Verificación de interacciones: si se llamó al método, cuántas veces, con qué argumentos. \n
Para crear mocks en C++, el estándar de facto es la biblioteca Google Mock (también conocida como gmock), que viene con Google Test. Pero también se pueden escribir mocks manualmente; para proyectos pequeños, incluso es más sencillo.
\n\nFixtures: preparando el escenario para la prueba
\n\nUn fixture (test fixture) es un conjunto de objetos y datos necesarios para ejecutar la prueba. En lugar de escribir cada vez:
\n\nMyClass obj;\nobj.init("data");\nobj.connect();\n\n…se saca esto a un fixture. Google Test admite fixtures mediante herencia de ::testing::Test. Esto no solo es conveniente, sino que es una mejor práctica de pruebas en C++.
Los fixtures resuelven tres tareas:
\n- \n
- Reutilización de código — se configura una vez, se usa en todas las pruebas. \n
- Limpieza de las pruebas — cada prueba comienza con el mismo estado. \n
- Limpieza automática — si es necesario liberar recursos, se hace en el destructor del fixture. \n
Y ahora, combinemos mocks y fixtures en un ejemplo.
\n\nEscribiendo una prueba con un objeto mock y un fixture: ejemplo real
\n\nSupongamos que tenemos una clase WeatherReporter que obtiene datos meteorológicos a través de una API. Queremos probar el método getTemperature() sin acceder al servidor real.
Paso 1. Definir la interfaz
\n\nPara poder insertar un mock, necesitamos una clase abstracta. Este es un punto clave: los mocks funcionan a través del polimorfismo.
\n\n// weather_api.h\nclass WeatherAPI {\npublic:\n virtual ~WeatherAPI() = default;\n virtual double getTemperature(const std::string& city) = 0;\n virtual bool isAvailable() = 0;\n};\n\nPaso 2. Implementar el mock con Google Mock
\n\n// mock_weather_api.h\n#include <gmock/gmock.h>\n#include "weather_api.h"\n\nclass MockWeatherAPI : public WeatherAPI {\npublic:\n MOCK_METHOD(double, getTemperature, (const std::string& city), (override));\n MOCK_METHOD(bool, isAvailable, (), (override