変更不可能なコードに対する Golang Monkey パッチ適用
Go では、ランタイム オブジェクトの変更がないため、依存関係のない高度に相互接続されたコードをテストすることが困難になりますインジェクションまたはインターフェースプログラミング。この制限を回避するには、次のアプローチの使用を検討してください。
モッキング ラッパー インターフェイスの作成
元の構造体をラップする独自のインターフェイスを定義します。例:
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) }
アダプター構造体の使用
元の構造体の実装を適応させる新しい構造体にラッパー インターフェイスを実装します:
type Concrete struct { client *somepackage.Client } func (c *Concrete) DoSomething(i int) error { return c.client.DoSomething(i) } func (c *Concrete) DoSomethingElse() ([]int, error) { return c.client.DoSomethingElse() }
によるテストWrapper
インターフェイスに準拠しているため、単体テストで具象構造体をモックできるようになりました:
// Mock Concrete mock := &MockMyInterface{} c := Concrete{mock} // Call mock method err := c.DoSomething(10)
元の型の埋め込み
@elithrar が提案しているように、元の型を埋め込んで必要な部分だけを選択的にモックすることもできますメソッド:
type Concrete struct { *somepackage.Client }
この場合でも、モックを必要としないメソッドの元の実装にアクセスできます:
c := Concrete{&somepackage.Client{}} c.DoSomethingNotNeedingMocking() // Calls the original implementation
以上が変更できない Go コードをテスト用にモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。