Сначала вам нужен тип (любой тип), который реализует интерфейс vInterface
. Вот простой пример:
type mockedVInterface struct {
value bool
}
func (m mockedVInterface) function1() bool {
return m.value
}
Это достаточно простая реализация, которой мы можем управлять: мы можем сказать, что должна возвращать ее функция function1()
, просто установив это значение в поле value
.
Этот тип mockedVInterface
создан исключительно для целей тестирования, производственному коду это не нужно. Поместите его в тот же файл, где у вас есть тестовый код (поместите его перед Test_callSomething()
).
А вот код тестирования:
func Test_callSomething(t *testing.T) {
type args struct {
si vInterface
}
tests := []struct {
name string
args args
want bool
}{
{
name: "testing false",
args: args{
si: mockedVInterface{value: false},
},
want: false,
},
{
name: "testing true",
args: args{
si: mockedVInterface{value: true},
},
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := callSomething(tt.args.si); got != tt.want {
t.Errorf("callSomething() = %v, want %v", got, tt.want)
}
})
}
}
Обратите внимание, что в этом простом случае мы могли бы также использовать простой неструктурный тип, который имеет bool
в качестве базового типа, например:
type mockedVInterface bool
func (m mockedVInterface) function1() bool {
return bool(m)
}
И это работает, и тестирование кода также проще:
tests := []struct {
name string
args args
want bool
}{
{
name: "testing false",
args: args{
si: mockedVInterface(false),
},
want: false,
},
{
name: "testing true",
args: args{
si: mockedVInterface(true),
},
want: true,
},
}
Но это работает только в том случае, если в макетируемом интерфейсе есть одна функция с одним возвращаемым значением. В общем случае требуется структура.