2017-04-21 18 views
2

https://gopkg.in/olivere/elastic.v2とそれが悪夢であることを証明しようとしています。私は通常gomockを使いますが、depのインターフェースファイルはありません。これについてはどうすればいいですか?依存関係がインターフェイスを公開していないときにGOで依存関係を模擬する最善の方法は

+6

パッケージのエクスポートされた機能に対してインターフェースを定義することができます。Goのインターフェースは暗黙的に実装されています**。 – mkopriva

+0

@mkoprivaこれは私がやろうとしてきたことですが、問題は数多くの問題につながるインターフェイスを作成するためにパッケージに作成された構造体を返さなければならないということです –

+2

sepcificallyにはどんな問題がありますか?あなたはそれらの特定の問題の説明であなたの質問を更新してもよろしいですか? – mkopriva

答えて

5

独自のインターフェイスを作成します。

これは完全である必要はなく、実際に使用する方法だけをカバーする必要もあります。

Bar(),Baz()およびのタイプのFooがあるとします。

そして、あなたはあなたのコードでこれを使用します。

func Frobnicate(f *Foo) err { 
    if err := f.Bar() error; err != nil { 
     return err 
    } 
    return nil 
} 

はちょうどあなたの新しいカスタムインターフェイスを使用するようにこれを変更:今すぐ

func Frobnicate(f fooer) err { 
    // The rest the same as before 

type barer interface() { 
    Bar() error 
} 

は、その後、あなたの関数のシグネチャを更新します独自のfooerの実装を作成し、嘲笑してください。

モックする必要があるタイプが、メソッドではなくデータを持つ単純な構造体である場合、メソッドはgetter/setterメソッドでラップすることができます。あなたがラッパーを作成することができます

type Foo struct { 
    Name string 
} 

type FooWrapper struct { 
    Foo 
} 

func (w *FooWrapper) Name() string { 
    return w.Foo.Name 
} 

Fooタイプはモックのためのカスタムインターフェイスを使用してアクセスすることができる。例えば、このタイプを与えられました。

+0

答えとしてマークする必要があります。 –

+0

これは素晴らしいです、あなたはgetter/setterのアイデアを詳しく教えてください。 –

+0

@DanielKobeが更新されました。 – Flimzy

関連する問題