簡體   English   中英

當依賴項不公開接口時,在GO中模擬依賴項的最佳方法是什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM