use go-cmp for gomock
gomock is a useful tools for mocking in Go.
but when we want to compare struct, builtin matchers are not enough.
i want to use go-cmp for compare two structs.
gomock exports Matcher interface
https://github.com/golang/mock/blob/73266f9366fcf2ccef0b880618e5a9266e4136f4/gomock/matchers.go#L25
i created custom matcher
code:go
type gocmpMatcher struct {
want interface{}
options []cmp.Option
diff string
}
var _ gomock.Matcher = (*gocmpMatcher)(nil)
func (m *gocmpMatcher) Matches(got interface{}) bool {
m.diff = cmp.Diff(want, got, m.options...)
return m.diff != ""
}
func (m *gocmpMatcher) String() string {
return fmt.Sprintf("diff is %s", m.diff)
}
func Diff(want interface{}, options ...cmp.Option) *gocmpMatcher {
return &gocmpMatcher{want: want, options: options}
}
usage
code:go
x.EXPECT().DoSomething(ctx, Diff(
&foo.Bar{A: "a"},
cmpopt.IgnoreFields(&foo.Bar{}, "B"),
))