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 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"),
))