2017-03-16 8 views
1

私はゴーランにとってかなり新しく、簡単な作業に苦しんでいます。ゴーランで特定の方法のみをモックする方法

しかし、そのために私はgetSecond()をオーバーライドする必要が私はgolangに

type struct A { 
} 

func (s *A) GetFirst() { 
    s.getSecond() 
} 

func (s *A) getSecond() { 
    // do something 
} 

を以下のクラスを持っていると私はそれのためにいくつかのテストを書きたいです。私はここでの考え方は、しかし、これは動作していないように埋め込む使用してインターフェイスとオーバーライドにgetSecond()方法を公開することです

type Ai interface { 
    getSecond() 
} 

type testA struct { 
    A 
} 

func (s *testA) getSecond() { 
    // do nothing 
} 

func TestA(t *testing.T) { 
    a := &A{} 
    t := &testA{A: a} 
    t.GetFirst() 
} 
私のテストファイルに次の操作を実行しようとしました。テストでは、私の模擬の代わりに getSecond()の元の実装が呼び出されます。

一つの解決策は、当然getFirst()getSecond()、次いで試験において実装構造体を作成が含まれている適切なインタフェースを作成することで、両方のgetFirst()呼び出し元の実装とgetSecond()ダミーしかし、私は、これは面倒でなく感じる場合物事を行う正しい方法。

実際の実装のgetSecond()を変数に代入してテスト中の変数をオーバーライドすることもできますが、単純なオーバーライドの場合はこれを行うのが少し奇妙だと感じます。

私はこれについてすべて間違っていますか? golangを使ってこれを行う簡単な方法はありますか?

+0

の異なる実装がありますか?本当の理由は何ですか?本当にうまくいくのは、 'A'(すべてのgory内部構造体にアクセスすることは簡単です)を構築し、' getFirst() 'と' getSecond() 'が目的の結果を生成することを確認します。すすぎ、繰り返します。これがどのように行われているのか標準ライブラリを見てください。 getFirst()は 'getSecond()'を使っているので、 'getSecond()'をモックする必要があると思います。いいえ、getSecond()が 'A'の状態で何をするかを制御することができます。そして、してください:ゲッターはゴーにはありません(ゴーランではありません)。 – Volker

+0

実際にはゲッタではないので、例のような関数に名前を付けました:) ここで問題となるのは、getFirstは単体テスト状況では動作しないものを実行するgetSecondを呼び出すことです。 – ByteFlinger

+0

より正確に言えば、 AにはbaseUrlがあり、getFirst()はhttpリクエストを実行しますが、その前にリクエストのタイプに応じてサブドメインを含むようにURLベースドメインを書き直す必要があります。これがgetSecond()の機能です。これによりhttptestパッケージの問題が発生し、http://subdomain.127.0.0.1になります。 – ByteFlinger

答えて

1

this answerのようにゴーランのメソッドを実際にオーバーライドすることはできません。しかし、あなたが指摘しているように、 "getSecondメソッド"のための別のインタフェースを持ち、テストケースに1つの実装を、実際のコードに1つの実装を持たせることができます。あなたがいずれかの方法をモックとしたいのはなぜ

試験におけるその後
type s interface{ 
    getSecond() 
} 

type A struct{ 
    s 
} 

type a struct{ 

} 

func (s *A) GetFirst() { 
    s.getSecond() 
} 

func (s a) getSecond() { 
    // do something 
} 

//Use a 
A{a{}} 

は「」

type struct ta { 

} 
func (s ta) getSecond() { 
    // do nothing 
} 

A{ta{}} 
+0

質問で私が提供したデータの量を考えると、これは非常に受け入れられる解決策だと思います。 Volkerが、すべてのものを接着するために使用され、余分なロジックを追加しないメソッドをテストしないで生きることができるのであれば、私の質問の下のコメントに投稿したものです。 – ByteFlinger

関連する問題