httpmock for Go: Complete Guide with Examples

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

httpmock for Go: Complete Guide with Examples

1. What It Is and Why You Need It

The httpmock library for Go provides a powerful and flexible tool for mocking (simulating) HTTP requests and responses in tests. In modern software development, interacting with external APIs, web services, and microservices is an essential part of the process. However, testing code that directly calls these external resources comes with several challenges: network dependency, slow test execution, unpredictable real server responses, and the inability to reproduce edge cases (such as timeouts or specific error codes). httpmock solves these problems by allowing developers to intercept HTTP requests at Go's transport layer and return predefined responses, completely isolating the tested code from the outside world.

The main goal of httpmock is to make unit tests and integration tests involving HTTP clients fast, reliable, and deterministic. Instead of sending real requests over the internet, the library replaces Go's default HTTP transport (http.RoundTripper) with its own, which matches incoming requests against a set of registered "stubs." Each stub defines the conditions a request must meet (method, URL, headers, body) and the response to return. This lets you test response handling logic, retries, error handling, and other aspects without spinning up real servers.

httpmock is especially useful in these scenarios: testing REST API clients, testing services that aggregate data from multiple external sources, testing webhook handlers, and developing in environments with limited or unstable internet connections. Thanks to its simplicity and seamless integration with the net/http package, httpmock is the de facto standard for HTTP mocking in the Go community.

2. Installation

Installing httpmock is done the standard Go way using the go get command. Make sure you have Go version 1.11 or higher installed (for module support).

go get github.com/jarcoal/httpmock

After running this command, the library will be added to your go.mod file. To update to the latest version, use:

go get -u github.com/jarcoal/httpmock

You can now import the library into your test files:

import "github.com/jarcoal/httpmock"

3. Quick Start — Minimal Working Example

Let's create a simple test that checks a function making a GET request to an external API and returning the response body. We'll mock this request so the test runs without actually hitting the network.

package main

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

// FetchData makes a GET request to the given URL and returns the response body.
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() {
    // This is just a demo; in practice, the function will be called from tests.
    data, err := FetchData("https://api.example.com/data")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Data:", data)
}

Now let's write a test using httpmock:

package main

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

func TestFetchData(t *testing.T) {
    // 1. Activate mocking                    

Recommendations