golang / mock

GoMock is a mocking framework for the Go programming language.
Apache License 2.0
9.3k stars 611 forks source link

Add builtin custom matcher function #695

Open ilya-hontarau opened 1 year ago

ilya-hontarau commented 1 year ago

Requested feature Add builtin custom matcher function

Why the feature is needed Currently, we should implement Matcher interface in our own code, and it can be useful to provide the ability to create custom matcher using a function in the lib.

Proposed solution We can create a constructor function, that accepts fmt.Stringer, a match function and returns a new matcher.

    mockMatcher.EXPECT().Matches(gomock.Custom(
        gomock.StringerFunc(func() string {
            return `expect string contains"test"`
        }),
        func(i interface{}) bool {
            v, ok := i.(string)
            if !ok {
                return false
            }
            return strings.Contains(v, "test")
        },
    )).Return(true)
ichekrygin commented 1 year ago

With generics support, it could be something as simple as: [NOT A CONTRIBUTION] 😮‍💨


type CustomMatcher[T any] struct {
    value T
}
func (c *CustomMatcher[T]) Matches(value interface{}) bool {
    return reflect.DeepEqual(c.value, value)
}
func (c *CustomMatcher[T]) String() string {
    return fmt.Sprintf("%v", c.value)
}

func Custom[T any](value T) gomock.Matcher {
    return &CustomMatcher[T]{
        value: value,
    }
}