httpmock
This library builds on Go's built-in httptest library, adding a more
mockable interface that can be used easily with other mocking tools like
testify/mock. It does this by providing a Handler that receives
HTTP components as separate arguments rather than a single *http.Request
object.
Where the typical http.Handler interface is:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
This library provides a server with the following interface, which works naturally with mocking libraries:
type Handler interface {
Handle(method, path string, body []byte) Response
}
Examples
The most primitive example, the OKHandler
, just returns 200 OK
to everything.
s := httpmock.NewServer(&httpmock.OKHandler{})
defer s.Close()
This example uses MockHandler, a Handler that is a testify/mock
object.
downstream := httpmock.NewMockHandler(t)
downstream.On("Handle", "GET", "/object/12345", mock.Anything).Return(httpmock.Response{
Body: []byte(`{"status": "ok"}`),
})
s := httpmock.NewServer(downstream)
defer s.Close()
downstream.AssertExpectations(t)
If instead you wish to match against headers as well, a slightly different httpmock object can be used (please note the change in function name to be matched against):
downstream := &httpmock.NewMockHandlerWithHeaders(t)
downstream.On("HandleWithHeaders", "GET", "/object/12345", HeaderMatcher("MOCK", "this"), mock.Anything).Return(httpmock.Response{
Body: []byte(`{"status": "ok"}`),
})
The httpmock package also provides helpers for checking calls using json objects, like so:
type Obj struct {
A string `json:"a"`
}
o := &Obj{A: "aye"}
downstream.On("Handle", "POST", "/echo", httpmock.JSONMatcher(o)).Return(httpmock.Response{
Body: httpmock.ToJSON(o),
})