diff --git a/mock/mock.go b/mock/mock.go index 58e0798..36de508 100644 --- a/mock/mock.go +++ b/mock/mock.go @@ -527,6 +527,38 @@ func (m *Mock) AssertNotCalled(t TestingT, methodName string, arguments ...inter return true } +// IsMethodCallable checking that the method can be called. +// Is returned bool val +func (m *Mock) IsMethodCallable(t TestingT, methodName string, arguments ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + m.mutex.Lock() + defer m.mutex.Unlock() + for _, v := range m.ExpectedCalls { + if v.Method != methodName { + continue + } + if len(arguments) != len(v.Arguments) { + continue + } + if v.Repeatability < v.totalCalls { + continue + } + var argsEqual = true + for i, arg := range v.Arguments { + if !reflect.DeepEqual(arguments[i], arg) { + argsEqual = false + continue + } + } + if argsEqual { + return true + } + } + return false +} + func (m *Mock) methodWasCalled(methodName string, expected []interface{}) bool { for _, call := range m.calls() { if call.Method == methodName { diff --git a/mock/mock_test.go b/mock/mock_test.go index 7da34b7..8c3bbd2 100644 --- a/mock/mock_test.go +++ b/mock/mock_test.go @@ -1143,6 +1143,34 @@ func Test_Mock_AssertNotCalled(t *testing.T) { } +func Test_Mock_IsMethodCallable(t *testing.T) { + var mockedService = new(TestExampleImplementation) + + mockedService.On("Test_Mock_IsMethodCallable", 1, 5).Return(5, 5).Twice() + + assert.False(t, mockedService.IsMethodCallable(t, "Test_Mock_IsMethodCallable", 1)) + assert.False(t, mockedService.IsMethodCallable(t, "Test_Mock_IsMethodCallable", 1, 6)) + assert.False(t, mockedService.IsMethodCallable(t, "Test_Mock_IsMethodCallable", 2, 5)) + assert.False(t, mockedService.IsMethodCallable(t, "Test_Mock_IsMethodCallable", 1, int64(5))) + assert.False(t, mockedService.IsMethodCallable(t, "Test_Mock_Check", 1, 5)) + + assert.True(t, mockedService.IsMethodCallable(t, "Test_Mock_IsMethodCallable", 1, 5)) + mockedService.MethodCalled("Test_Mock_IsMethodCallable", 1, 5) + assert.True(t, mockedService.IsMethodCallable(t, "Test_Mock_IsMethodCallable", 1, 5)) + mockedService.MethodCalled("Test_Mock_IsMethodCallable", 1, 5) + + assert.False(t, mockedService.IsMethodCallable(t, "Test_Mock_IsMethodCallable", 1, 5)) + + arr := Call{Repeatability: 1} + mockedService.On("Function", arr).Return(true).Twice() + assert.True(t, mockedService.IsMethodCallable(t, "Function", arr)) + mockedService.MethodCalled("Function", arr) + assert.True(t, mockedService.IsMethodCallable(t, "Function", arr)) + mockedService.MethodCalled("Function", arr) + + assert.False(t, mockedService.IsMethodCallable(t, "Function", arr)) +} + func Test_Mock_AssertOptional(t *testing.T) { // Optional called var ms1 = new(TestExampleImplementation)