ホームページ > バックエンド開発 > Golang > テストやベンチマークのために Go でモンキー パッチの効果を実現するにはどうすればよいですか?

テストやベンチマークのために Go でモンキー パッチの効果を実現するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-11 12:26:11
オリジナル
723 人が閲覧しました

How Can I Achieve the Effect of Monkey Patching in Go for Testing and Benchmarking?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート