HTTP Mock Server For Tests
Spin up an in-process stub server with canned JSON responses, track request counts atomically, and exercise not-found paths.
Code
package main
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"sync/atomic"
)
type StubResponse struct {
Status int
Body string
}
func NewStubServer(responses map[string]StubResponse, hits *int64) *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if hits != nil {
atomic.AddInt64(hits, 1)
}
response, ok := responses[r.URL.Path]
if !ok {
http.NotFound(w, r)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(response.Status)
_, _ = io.WriteString(w, response.Body)
}))
}
func main() {
var hits int64
server := NewStubServer(map[string]StubResponse{
"/users/1": {Status: http.StatusOK, Body: `{"id":1,"name":"ada"}`},
"/health": {Status: http.StatusOK, Body: `{"status":"ok"}`},
}, &hits)
defer server.Close()
for _, requestPath := range []string{"/users/1", "/health", "/missing"} {
response, err := http.Get(server.URL + requestPath)
if err != nil {
panic(err)
}
body, err := io.ReadAll(response.Body)
response.Body.Close()
if err != nil {
panic(err)
}
fmt.Printf("%s -> %d %s\n", requestPath, response.StatusCode, string(body))
}
fmt.Println("total requests:", atomic.LoadInt64(&hits))
}Report a problem with this exampleOpens a pre-filled issue on GitHub.