Mockery para Go: guía completa con ejemplos prácticos

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

Mockery para Go: guía completa con ejemplos prácticos

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

Mockery es una potente herramienta para generar objetos simulados (mock objects) en el lenguaje Go. En el desarrollo moderno con Go, donde las interfaces juegan un papel fundamental, probar componentes de forma aislada a menudo requiere crear sustitutos para las dependencias externas. Mockery automatiza este proceso generando implementaciones completas de interfaces que puedes usar en tus tests unitarios. En lugar de escribir decenas de líneas de código manualmente para cada interfaz, simplemente ejecutas un comando y obtienes un mock listo con todos los métodos necesarios.

El objetivo principal de Mockery es simplificar las pruebas de código que depende de servicios externos (bases de datos, APIs, sistemas de archivos, etc.). Los mocks generados te permiten controlar los valores de retorno, verificar la cantidad de llamadas a métodos y los argumentos con los que fueron invocados. Esto es especialmente útil en el desarrollo de microservicios, donde cada componente debe probarse de forma aislada. La biblioteca utiliza el popular paquete testify/mock como base, lo que garantiza compatibilidad con la mayoría de los proyectos Go.

Mockery soporta tanto interfaces simples con pocos métodos como jerarquías complejas. Puede generar mocks para tipos integrados, interfaces de paquetes de terceros e incluso interfaces genéricas (a partir de Go 1.18). Gracias a su sistema de configuración flexible, puedes controlar los nombres de archivo, los paquetes donde se colocan los mocks e incluso añadir métodos personalizados. Esto convierte a Mockery en una herramienta indispensable en el arsenal de cualquier desarrollador Go que busque código de calidad y fácil de mantener.

2. Instalación

La instalación de Mockery se realiza a través del gestor de paquetes estándar de Go. Para ello, ejecuta el siguiente comando:

go install github.com/vektra/mockery/v2@latest

Después de la instalación, asegúrate de que el archivo binario esté en tu $PATH. Normalmente se instala en $GOPATH/bin o $HOME/go/bin. Puedes verificar la instalación con el comando:

mockery --version

Si usas módulos Go, se recomienda añadir Mockery como herramienta de desarrollo. Para ello, crea o edita el archivo tools.go en la raíz del proyecto:

//go:build tools
// +build tools

package tools

import (
    _ "github.com/vektra/mockery/v2"
)

Luego ejecuta:

go mod tidy

Esto garantiza que la versión de Mockery quede fijada en tu archivo go.mod.

3. Inicio rápido — ejemplo mínimo funcional

Veamos un ejemplo sencillo. Supongamos que tenemos una interfaz UserRepository:

// user.go
package main

type User struct {
    ID   int
    Name string
}

type UserRepository interface {
    GetUser(id int) (*User, error)
    SaveUser(user *User) error
}

Para generar el mock, ejecuta el siguiente comando en la raíz del proyecto:

mockery --name=UserRepository --output=mocks --with-expecter

Este comando creará el archivo mocks/UserRepository.go con la implementación del mock. Ahora podemos usarlo en un test:

// user_test.go
package main

import (
    "testing"
    "github.com/stretchr/testify/assert"
    "tu-proyecto/mocks"
)

func TestGetUser(t *testing.T) {
    // Creamos el mock
    mockRepo := mocks.NewUserRepository(t)
    
    // Configuramos el comportamiento esperado
    expectedUser := &User{ID: 1, Name: "Alice"}
    mockRepo.On("GetUser", 1).Return(expectedUser, nil)
    
    // Llamamos a la función bajo prueba
    user, err := mockRepo.GetUser(1)
    
    // Verificamos los resultados
    assert.NoError(t, err)
    assert.Equal(t, expectedUser, user)
    
    // Verificamos que todas las expectativas se cumplieron
    mockRepo.AssertExpectations(t)
}

Recommendations