Есть ли возможность использовать что-то похожее на захват аргумента mockito?

Мы используем gopkg.in/mgo.v2/bson для общения с mongo, и его API заполняет переданные структуры, а не возвращает результаты, например:

func (p *Pipe) One(result interface{}) error {...

Проблемы возникают, когда я хочу макетировать / тестировать код, который использует это. Я хочу и посмеяться над этим исполнением, и каким-то образом получить озвученное значение в "результате". В настоящее время тест имеет:

query.EXPECT().One(gomock.Any())

Итак, как вы видите, я не получаю никакого значения, я просто настраиваю gomock, чтобы проверить, что при запуске моего метода должен вызываться query.One. Я не могу передать структуру, как

mystruct := MyStruct{}
query.EXPECT().One(&mystruct)

потому что mystruct в тестовом коде и в реальном коде отличается, и проверка макета не удастся (ссылки разные). Я ищу что-то похожее на захват аргумента mockito: https://static.javadoc.io/org.mockito/mockito-core/2.6.9/org/mockito/ArgumentCaptor.html

1 ответ

Это может быть достигнуто с помощью Do.

Пример копирования и вставки из Github из poy.

var capturedArgs []int

someMock.
  EXPECT().
  SomeMethod(gomock.Any()).
  Do(func(arg int){
    capturedArgs = append(capturedArgs, arg)
  })

Ссылка: https://github.com/golang/mock/pull/149

Этот проект может помочь вам: https://github.com/bouk/monkey. Вы можете заменить функцию и использовать переменную bool для проверки использования.

called := false    
monkey.Patch(package.One, func(result interface{}) error {
    if result == expected {
       called := true
       return nil
    }
    return errors.new("not expected")
})

Не забудьте восстановить исходную функцию.

defer monkey.Unpatch(package.One)
Другие вопросы по тегам