ホームページ >バックエンド開発 >Golang >変更できない Go コードをテスト用にモックするにはどうすればよいですか?

変更できない Go コードをテスト用にモックするにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-09 17:31:17441ブラウズ

How Can I Mock Unmodifiable Go Code for Testing?

変更不可能なコードに対する Golang Monkey パッチ適用

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()
}

によるテストWrapper

インターフェイスに準拠しているため、単体テストで具象構造体をモックできるようになりました:

// Mock Concrete
mock := &MockMyInterface{}
c := Concrete{mock}

// Call mock method
err := c.DoSomething(10)

元の型の埋め込み

@elithrar が提案しているように、元の型を埋め込んで必要な部分だけを選択的にモックすることもできますメソッド:

type Concrete struct {
    *somepackage.Client
}

この場合でも、モックを必要としないメソッドの元の実装にアクセスできます:

c := Concrete{&somepackage.Client{}}
c.DoSomethingNotNeedingMocking() // Calls the original implementation

以上が変更できない Go コードをテスト用にモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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