mockall para Rust: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

mockall para Rust: guía completa con ejemplos

1. ¿Qué es y para qué sirve?

La librería mockall es un potente framework para crear objetos simulados (mock objects) en el lenguaje Rust. Está diseñada para pruebas unitarias y permite a los desarrolladores aislar fácilmente el código bajo prueba de dependencias externas como bases de datos, clientes HTTP, sistemas de archivos o cualquier otro servicio. A diferencia de escribir stubs manualmente, mockall genera automáticamente estructuras mock a partir de traits existentes, proporcionando una API flexible para configurar expectativas y verificar llamadas.

¿Por qué es necesaria? En proyectos reales, el código rara vez existe en el vacío. Las funciones llaman a otras funciones, los módulos dependen de librerías externas. Al probar un módulo específico, no queremos que el test dependa de que la base de datos o la red funcionen correctamente. Mockall resuelve este problema permitiendo crear mocks que imitan el comportamiento de las dependencias reales. Puedes definir qué debe devolver un método con ciertos argumentos, cuántas veces debe ser llamado e incluso verificar el orden de las llamadas. Esto hace que los tests sean rápidos, fiables y reproducibles.

La característica clave de mockall es su integración con el sistema de tipos de Rust y su funcionamiento en tiempo de compilación mediante el atributo #[automock]. Esto significa que los mocks se generan automáticamente para cualquier trait, ahorrando mucho tiempo y reduciendo la cantidad de código repetitivo. La librería soporta funciones asíncronas, genéricos, traits con tipos asociados y mucho más, lo que la convierte en una herramienta indispensable para el desarrollo serio en Rust.

2. Instalación

Para usar mockall en tu proyecto de Rust, añade la dependencia en el archivo Cargo.toml. La librería se instala a través del gestor de paquetes estándar Cargo. Se recomienda añadirla solo como dev-dependency, ya que se utiliza exclusivamente para pruebas.


# Cargo.toml
[dev-dependencies]
mockall = "0.13"  # Usa la versión más reciente al momento de leer
        

Después de añadir la línea, ejecuta el comando cargo build o cargo test para que Cargo descargue y compile la librería. Si trabajas en un proyecto con otras dependencias, asegúrate de que la versión de mockall sea compatible con tu versión de Rust (normalmente se requiere Rust 1.70+). Para verificar la versión más reciente, visita crates.io/crates/mockall.

3. Inicio rápido

Vamos a crear un ejemplo mínimo funcional. Supongamos que tenemos un trait Greeter que queremos simular en un test. Con #[automock] obtenemos automáticamente la estructura MockGreeter.


// src/lib.rs
use mockall::automock;

#[automock]
pub trait Greeter {
    fn greet(&self, name: &str) -> String;
}

pub fn run_greeter(greeter: &impl Greeter, name: &str) -> String {
    greeter.greet(name)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_greeting() {
        // Creamos el mock
        let mut mock = MockGreeter::new();

        // Configuramos la expectativa: al llamar greet("Alice") devolver "Hello, Alice!"
        mock.expect_greet()
            .with(predicate::eq("Alice"))
            .returning(|name| format!("Hello, {}!", name));

        // Llamamos a la función bajo prueba
        let result = run_greeter(&mock, "Alice");

        // Verificamos el resultado
        assert_eq!(result, "Hello, Alice!");
    }
}
        

Ejecuta el test con el comando cargo test. Si todo está configurado correctamente, el test pasará sin problemas.

Recommendations