ホームページ >バックエンド開発 >Golang >テストを容易にするために、Go でモンキー パッチのような動作を実現するにはどうすればよいですか?

テストを容易にするために、Go でモンキー パッチのような動作を実現するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-08 17:19:10631ブラウズ

How Can I Achieve Monkey Patching-like Behavior in Go for Easier Testing?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。