Go でのモンキー パッチ: 変更不可能なコード ベースのソリューション
インターフェイスにプログラムされておらず、高度に相互接続されているコード ベースを操作すると、次のような問題が発生する可能性があります。テストとベンチマークの課題。このようなシナリオでは、従来のモック手法は適用できない可能性があります。ただし、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() }
このシナリオでは、Concrete は変更できないコードです。 。 MyInterface インターフェイスを作成し、元の Concrete 構造体を埋め込むことで、テストでそのメソッドをモックする柔軟性が得られます。
// Replace the embedded type with a mock in tests type MockConcrete struct { MyInterface } func (m *MockConcrete) DoSomething(i int) error { // Implement custom logic for mocking DoSomething }
このアプローチは、基礎となるコードを変更せずに特定の機能をテストする方法を提供します。
コメントで提案されているように、別のインターフェイスを作成する代わりに、目的のタイプを直接埋め込むこともできます。これにより、必要なメソッドのみを選択的にモックすることができます。
type Concrete struct { *somepackage.Client }
この戦略では、埋め込み型でモックされていないメソッドに直接アクセスする機能が維持され、テストの柔軟性が向上します。
以上がMonkey Patching は Go の変更不可能なコードベースのテスト問題を解決できるか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。