httpmock 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

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

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

La biblioteca httpmock para el lenguaje Go proporciona una herramienta potente y flexible para simular (mockear) peticiones y respuestas HTTP en pruebas. En el desarrollo de software moderno, la interacción con APIs externas, servicios web y microservicios es una parte esencial. Sin embargo, probar código que se comunica directamente con estos recursos externos conlleva varios problemas: dependencia de la disponibilidad de la red, ejecución lenta de las pruebas, imprevisibilidad de las respuestas de servidores reales e imposibilidad de reproducir casos límite (como timeouts o códigos de error específicos). httpmock resuelve estos problemas permitiendo a los desarrolladores interceptar peticiones HTTP a nivel de transporte en Go y devolver respuestas predefinidas, aislando completamente el código bajo prueba del mundo exterior.

El objetivo principal de httpmock es hacer que las pruebas unitarias y de integración relacionadas con clientes HTTP sean rápidas, fiables y deterministas. En lugar de enviar peticiones reales a internet, la biblioteca reemplaza el transporte HTTP estándar de Go (http.RoundTripper) por uno propio, que compara las peticiones entrantes con un conjunto de "stubs" registrados. Cada stub define las condiciones que debe cumplir una petición (método, URL, cabeceras, cuerpo) y la respuesta que se debe devolver. Esto permite probar la lógica de procesamiento de respuestas, reintentos, manejo de errores y otros aspectos sin necesidad de levantar servidores reales.

httpmock es especialmente útil en los siguientes escenarios: pruebas de clientes para APIs REST, pruebas de servicios que agregan datos de múltiples fuentes externas, pruebas de manejadores de webhooks, y desarrollo en entornos con conexión a internet limitada o inestable. Gracias a su simplicidad e integración con el paquete net/http, httpmock es el estándar de facto para simular HTTP en la comunidad Go.

2. Instalación

La instalación de httpmock se realiza de la forma estándar en Go usando el comando go get. Asegúrate de tener instalado Go versión 1.11 o superior (para soporte de módulos).

go get github.com/jarcoal/httpmock

Después de ejecutar este comando, la biblioteca se añadirá a tu archivo go.mod. Para actualizar a la última versión, usa:

go get -u github.com/jarcoal/httpmock

Ahora puedes importar la biblioteca en tus archivos de prueba:

import "github.com/jarcoal/httpmock"

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

Vamos a crear una prueba simple que verifique una función que hace una petición GET a una API externa y devuelve el cuerpo de la respuesta. Simularemos esta petición para que la prueba se ejecute sin una llamada real a la red.

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

// FetchData hace una petición GET a la URL indicada y devuelve el cuerpo de la respuesta.
func FetchData(url string) (string, error) {
    resp, err := http.Get(url)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }
    return string(body), nil
}

func main() {
    // Esto es solo una demostración, en la práctica la función se llamará desde las pruebas.
    data, err := FetchData("https://api.example.com/data")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Data:", data)
}

Ahora escribamos la prueba usando httpmock:

package main

import (
    "testing"
    "github.com/jarcoal/httpmock"
)

func TestFetchData(t *testing.T) {
    // 1. Activamos el mock                    

Recommendations