Go Academy · Lección

Dobles de prueba: mocks y stubs

Interfaces para facilitar las pruebas e inyección de dependencias

Lección 3 de 413 pasos

Dobles de prueba: mocks y stubs es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Introducción a los dobles de prueba

Un doble de prueba sustituye una dependencia real en las pruebas. Tipos: stub (devuelve respuestas predefinidas), mock (verifica interacciones), spy (registra llamadas) y fake (implementación funcional en memoria).

Las interfaces permiten usar dobles de prueba

Diseñe las funciones para que acepten interfaces en lugar de tipos concretos. En producción, proporcione la implementación real; en las pruebas, proporcione un doble de prueba.

type UserStore interface {
    FindByID(id int) (*User, error)
}

func GetUser(store UserStore, id int) (*User, error) {
    return store.FindByID(id)
}

Stub manual

Un stub es una estructura sencilla que implementa una interfaz y devuelve valores preconfigurados:

type stubStore struct{ user *User; err error }
func (s *stubStore) FindByID(_ int) (*User, error) { return s.user, s.err }

// In test:
store := &stubStore{user: &User{Name: "Alice"}}
result, _ := GetUser(store, 1)

Mock manual

Un mock registra las llamadas y realiza aserciones sobre ellas:

type mockStore struct {
    called bool
    gotID  int
    user   *User
}
func (m *mockStore) FindByID(id int) (*User, error) {
    m.called = true; m.gotID = id
    return m.user, nil
}
// Assert: if !mock.called { t.Error(...) }

testify/mock

El paquete testify/mock genera o permite escribir objetos mock con expectativas de llamadas y configuración de valores de retorno:

type MockStore struct { mock.Mock }
func (m *MockStore) FindByID(id int) (*User, error) {
    args := m.Called(id)
    return args.Get(0).(*User), args.Error(1)
}
// In test:
m := new(MockStore)
m.On("FindByID", 1).Return(&User{}, nil)
m.AssertExpectations(t)

gomock

go.uber.org/mock/gomock (antes golang/mock) genera mocks a partir de interfaces. Use la CLI mockgen para generarlos y use EXPECT() para establecer expectativas.

Fake

Un fake es una implementación funcional en memoria. Por ejemplo, un almacén de usuarios en memoria que guarda los usuarios en un mapa. Los fakes requieren más trabajo de escritura, pero son más realistas y menos frágiles que los mocks.

type fakeStore struct{ users map[int]*User }
func (f *fakeStore) FindByID(id int) (*User, error) {
    u, ok := f.users[id]
    if !ok { return nil, ErrNotFound }
    return u, nil
}

httptest para clientes HTTP

net/http/httptest proporciona un servidor HTTP de prueba en el mismo proceso y un recorder; es el fake estándar para las dependencias basadas en HTTP.

ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    json.NewEncoder(w).Encode(User{Name: "Alice"})
}))
defer ts.Close()

Cuándo usar cada doble

Stub: respuesta fija sencilla. Mock: verifica el número de llamadas y sus argumentos. Fake: comportamiento complejo. Evite abusar de los mocks; los fakes y los componentes reales en las pruebas de integración son más fiables.

Evitar pruebas frágiles

Los mocks que comprueban el orden exacto de las llamadas o los valores exactos de los argumentos se vuelven frágiles a medida que evoluciona la implementación. Prefiera stubs con aserciones sobre las salidas o fakes cuando sea posible.

Descubrimiento de interfaces

Extraiga las interfaces después de identificar la superficie del tipo concreto que utilizan los llamadores (ISP). Go admite la satisfacción implícita de interfaces: no es necesario modificar el tipo concreto.

Comprobación rápida

¿Cuál es la diferencia principal entre un stub y un mock?

Resumen: dobles de prueba

Puntos clave:

  • Diseñe basándose en interfaces para permitir dobles de prueba
  • Stub: devuelve datos predefinidos; mock: verifica interacciones
  • httptest para HTTP; fakes en memoria para el almacenamiento
  • Evite abusar de los mocks; prefiera fakes para comportamientos complejos
Gratis para empezar

Aprende Go con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Dobles de prueba: mocks y stubs» es gratis?

Sí — el texto completo de «Dobles de prueba: mocks y stubs» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Dobles de prueba: mocks y stubs»?

Interfaces para facilitar las pruebas e inyección de dependencias Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Dobles de prueba: mocks y stubs»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Escritura de pruebas unitarias con testing
  2. Pruebas basadas en tablas
  3. Dobles de prueba: mocks y stubs
  4. Cobertura de pruebas y testify
← Volver a Go Academy