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)
}
También en la biblioteca
Crossbeam para Rust: guía completa con ejemplos
Configuración de aplicaciones en Go: mejores prácticas y herramientas
AddressSanitizer para C++: guía completa con ejemplos prácticos
ORM para Kotlin: comparación y ejemplos (Exposed, Ktorm, Hibernate)