[英]What's the best way to mock a dependency in GO when the dependency doesn't expose an interface
我試圖嘲笑https://gopkg.in/olivere/elastic.v2 ,事實證明這是一場噩夢。 我通常使用gomock,但不能這樣做,因為沒有用於dep的接口文件。 最好的方法是什么?
創建您自己的界面。
它甚至不需要完全,也只需要覆蓋您實際使用的方法即可。
假設您具有使用以下方法的Foo
類型: Bar()
, Baz()
和Qux()
。
然后在代碼中使用它:
func Frobnicate(f *Foo) err {
if err := f.Bar() error; err != nil {
return err
}
return nil
}
只需將其更改為使用新的自定義界面即可:
type barer interface() {
Bar() error
}
然后更新您的函數簽名:
func Frobnicate(f fooer) err {
// The rest the same as before
現在創建您自己的fooer
實現,然后進行模擬。
如果您需要模擬的類型是帶有數據的簡單結構,而不是方法,則可以使用getter / setter方法包裝該方法,以便接口可以解決該問題。 給定此類型的示例:
type Foo struct {
Name string
}
您可以創建一個包裝器:
type FooWrapper struct {
Foo
}
func (w *FooWrapper) Name() string {
return w.Foo.Name
}
現在,可以使用自定義界面進行模擬來訪問Foo
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.