Go でテストを記述する際、モックの生成にはしばしば gomock が使われますが、引数の検証に使う Matcher は標準では限られたもののみが用意されています。
たとえば、以下のテストの 12 行目では gomock.Eq(...)
を使って api.Client
に対して Get("/v1/info")
という呼び出しが 1 回されることを期待しています。
//go:generate mockgen -source=client.go -destination=client_mock.go -package=api
package api
import (
"io"
"net/http"
)
type Client interface {
Get(url string) (*http.Response, error)
Post(url, contentType string, body io.Reader) (*http.Response, error)
}
import (
"testing"
"go.uber.org/mock/gomock"
)
func TestServiceGet(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mock := api.NewMockClient(ctrl)
mock.EXPECT().Get(gomock.Eq("/v1/info")).Return(nil, nil)
service := domain.NewService(mock)
service.DoFancyStuff()
}
このような単純な比較であれば標準の Matcher でも事足りますが、以下のテストの 15 行目のように引数の検証が比較演算でできないケースもあり、gomock.Any()
を使って引数の検証自体を省略したままにしてしまうこともあります。