Строка
testobj.On("Add", 1, 2).Return(5)
означает, что вы ожидаете, что макет testobj
получит вызов его метода Add
с аргументами 1
и 2
, переданными ему, и вы также укажитечто этот вызов должен вернуть целочисленное значение 5
.
Но вместо этого в этой строке
assert.Equal(t, 5, result.Add(5, 6))
вы вызываете метод Add
с аргументами 5
и 6
.
Это приводит к полученной вами ошибке:
mock: Unexpected Method Call
-----------------------------
Add(int,int)
0: 5
1: 6
// this is result.Add(5, 6), the 0: and 1: are indexes of the actually passed in aguments.
The closest call I have is:
Add(int,int)
0: 1
1: 2
// this is testobj.On("Add", 1, 2), and 0: and 1: are indexes of the expected arguments.
Кроме того, ваши фиктивные реализации пытаются вычислить и вернуть значение.Это не то, что должен делать макет.Вместо этого имитатор должен возвращать значение, предоставленное ему методом Return
.
Способ сделать это можно с помощью значения args
, возвращенного методом Called
вызовите, это значение будет содержать аргументы метода Return
, проиндексированные в том же порядке, в котором они были переданы в Return
.
Таким образом, целочисленное значение 5
, которое вы передали Return
в этой строке
testobj.On("Add", 1, 2).Return(5)
можно получить, используя служебный метод Int
и передав ему 0-й индекс.То есть return args.Int(0)
вернет значение интергера 5
.
Таким образом, ваш тестовый файл должен выглядеть примерно так:
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
type MyMock struct {
mock.Mock
}
func (m *MyMock) Add(num1 int, num2 int) int {
args := m.Called(num1, num2)
return args.Int(0)
}
func (m *MyMock) Subtract(num1 int, num2 int) int {
args := m.Called(num1, num2)
return args.Int(0)
}
func TestDoComputation(t *testing.T) {
testobj := new(MyMock)
testobj.On("Add", 1, 2).Return(5)
// a := GetNewArithmetic(testobj)
result := GetNewArithmetic(testobj)
assert.Equal(t, 5, result.Add(1, 2))
testobj.AssertExpectations(t)
}