Go でのモンキー パッチ
Go プログラミング言語では、インターフェイスを中心に構造化されていないコードを扱う場合、モッキングが困難になることがあります。構造体が直接相互接続されており、依存関係の注入が存在しない場合、基礎となるコードを変更せずに効果的にテストやベンチマークを実行することが妨げられます。
Python などのスクリプト言語から思い浮かぶテクニックの 1 つは、モンキー パッチです。オブジェクトは実行時に変更できます。 Go にはオブジェクトを直接変更するための同等のメカニズムがありませんが、同様の結果を達成するための代替アプローチがあります。
一般的な戦略の 1 つは、モックする構造体の周囲のラッパーとして独自のインターフェイスを作成することです。これにより、基になる構造体の元の機能を維持しながら、インターフェイス メソッドに目的の動作を実装できます。例:
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() }
MyInterface を実装することで、テスト用のモック実装を作成できるようになります:
// MockMyInterface implements MyInterface for testing purposes type MockMyInterface struct { mockedDoSomethingError error mockedDoSomethingElseResult []int } func (m *MockMyInterface) DoSomething(i int) error { return m.mockedDoSomethingError } func (m *MockMyInterface) DoSomethingElse() ([]int, error) { return m.mockedDoSomethingElseResult, nil }
コメントで @elithrar によって提案された別のアプローチは、独自の構造体内でモックしたい型。これにより、必要なメソッドのみを選択的にモックすることができます:
type Concrete struct { *somepackage.Client }
クライアントを埋め込むことで、インターフェイスに追加したりモックを作成したりせずに、DoSomethingNotNeedingMocking のようなメソッドを直接呼び出すことができます。
これらの手法は、インターフェイスを中心に構造化されていないコードのテストおよびベンチマークを行うための、モンキー パッチ適用に代わる実行可能な代替手段を提供します。
以上がテストやベンチマークのために Go でモンキー パッチの効果を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。