Мое понимание шпионажа состоит в том, что один метод объекта является фальшивым или насмешливым, а другие - нет.Это невозможно в Go.Но вы можете подделать или смоделировать все ваши зависимости, используя интерфейсы.
Для того, чтобы подделать метод SomethingElse
, вы должны поместить его в другую структуру, отдельную от вашей структуры Object
.Структуре Object
также потребуется интерфейс с методом SomethingElse
.
type Object struct {
A int
elser Elser
}
func (o *Object) Something() {
// o.A = 102
o.elser.SomethingElse()
}
type Elser interface {
SomethingElse()
}
Теперь вы можете проверить поведение Object
, создав фальшивку, реализующую метод SomethingElse
:
type fakeElser struct {
somethingElseWasCalled bool
}
func (f *fakeElser) SomethingElse() {
f.somethingElseWasCalled = true
}
func TestSomething(t *testing.T) {
fake := &fakeElser{}
o := &Object{
elser: fake,
}
o.Something()
if o.A != 102 {
t.Errorf("expected A to be %d", 102)
}
if !fake.somethingElseWasCalled {
t.Error("expected SomethingElse to be called")
}
}
https://play.golang.org/p/RdmbM6Sj5qU