httpmock para Go: guia completo com exemplos práticos
1. O que é e para que serve
A biblioteca httpmock para a linguagem Go oferece uma ferramenta poderosa e flexível para simular (mockar) requisições e respostas HTTP em testes. No desenvolvimento de software moderno, a interação com APIs externas, serviços web e microsserviços é uma parte essencial. No entanto, testar código que se comunica diretamente com esses recursos externos traz diversos desafios: dependência de conectividade de rede, execução lenta dos testes, imprevisibilidade das respostas de servidores reais e dificuldade em reproduzir casos extremos (como timeouts ou códigos de erro específicos). O httpmock resolve esses problemas permitindo que desenvolvedores interceptem requisições HTTP no nível de transporte do Go e retornem respostas predefinidas, isolando completamente o código testado do mundo externo.
O principal objetivo do httpmock é tornar os testes unitários e de integração que envolvem clientes HTTP rápidos, confiáveis e determinísticos. Em vez de enviar requisições reais para a internet, a biblioteca substitui o transporte HTTP padrão do Go (http.RoundTripper) pelo seu próprio, que compara as requisições recebidas com um conjunto de "stubs" registrados. Cada stub define as condições que a requisição deve atender (método, URL, cabeçalhos, corpo) e a resposta que deve ser retornada. Isso permite testar a lógica de tratamento de respostas, tentativas de repetição, tratamento de erros e outros aspectos sem precisar levantar servidores reais.
O httpmock é especialmente útil nos seguintes cenários: teste de clientes para APIs REST, teste de serviços que agregam dados de múltiplas fontes externas, teste de handlers de webhooks e desenvolvimento em condições de conexão de internet limitada ou instável. Devido à sua simplicidade e integração com o pacote net/http, o httpmock é o padrão de facto para simulação de HTTP na comunidade Go.
2. Instalação
A instalação do httpmock é feita da forma padrão para Go, usando o comando go get. Certifique-se de ter o Go versão 1.11 ou superior instalado (para suporte a módulos).
go get github.com/jarcoal/httpmock
Após executar este comando, a biblioteca será adicionada ao seu arquivo go.mod. Para atualizar para a versão mais recente, use:
go get -u github.com/jarcoal/httpmock
Agora você pode importar a biblioteca nos seus arquivos de teste:
import "github.com/jarcoal/httpmock"
3. Início rápido — exemplo mínimo funcional
Vamos criar um teste simples que verifica uma função que faz uma requisição GET a uma API externa e retorna o corpo da resposta. Vamos simular essa requisição para que o teste seja executado sem acesso real à rede.
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
// FetchData faz uma requisição GET para a URL especificada e retorna o corpo da resposta.
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() {
// Isto é apenas uma demonstração; na prática, a função será chamada a partir dos testes.
data, err := FetchData("https://api.exemplo.com/dados")
if err != nil {
fmt.Println("Erro:", err)
return
}
fmt.Println("Dados:", data)
}
Agora vamos escrever o teste usando o httpmock:
package main
import (
"testing"
"github.com/jarcoal/httpmock"
)
func TestFetchData(t *testing.T) {
// 1. Ativamos a simulação