Go でのモンキー パッチ: 実行時にオブジェクトを変更する方法
Go で、インターフェースのない高度に相互接続されたコード ベースを操作する場合コンポーネントのモックやスワップアウトができないため、依存関係の注入、テスト、ベンチマークが困難になる可能性があります。ただし、Python などのスクリプト言語にはモンキー パッチに似た手法があり、Go の実行時にオブジェクトを変更できるようになります。
1 つのアプローチは、元のオブジェクトをラップし、テストでモックできるカスタム インターフェイスを作成することです。 。たとえば、somepackage というパッケージに依存する Concrete という名前の構造体がある場合:
type Concrete struct { client *somepackage.Client }
必要なメソッドを使用して独自のインターフェイス MyInterface を定義できます:
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) }
次に、このインターフェイスをモック オブジェクトに実装します。
type MockConcrete struct { DoSomethingCalled bool DoSomethingElseCalled bool } func (m *MockConcrete) DoSomething(i int) error { m.DoSomethingCalled = true return nil } func (m *MockConcrete) DoSomethingElse() ([]int, error) { m.DoSomethingElseCalled = true return []int{}, nil }
テストでは、モック オブジェクトを Concrete に挿入できます。
func TestDoSomething(t *testing.T) { mockConcrete := &MockConcrete{} c := &Concrete{client: mockConcrete} c.DoSomething(42) if !mockConcrete.DoSomethingCalled { t.Error("DoSomething was not called") } }
もう 1 つの手法は、モックしたい型を独自の構造体に埋め込むことです。これにより、元のオブジェクトの他のメソッドへのアクセスを維持しながら、モック用に必要なメソッドをオーバーライドできます。例:
type Concrete struct { *somepackage.Client }
このアプローチを使用すると、DoSomethingNotNeedingMocking などのオーバーライドされていないメソッドをモックアウトすることなく、Concrete で直接呼び出すことができます。
以上がテストを容易にするために、Go でモンキー パッチのような動作を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。