ホームページ >バックエンド開発 >Golang >Golang で関数を効果的にモックするにはどうすればよいですか?

Golang で関数を効果的にモックするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-07 07:51:17575ブラウズ

How Can I Effectively Mock Functions in Golang?

Golang のモック関数

Golang では、具象型で宣言された関数のモックは直接サポートされていません。ただし、同様の機能を実現するための戦略がいくつかあります。

関数の値

関数の値 (変数、構造体フィールド、パラメーターなど) はモック化できます。次の点を考慮してください:

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())

これらすべてのインスタンスの Fn はモック可能です。

インターフェース

インターフェースのモックは推奨オプションです。ターゲット関数のメソッドを表すインターフェイスを作成します:

type ProductRepository interface {
    GetProductById(DB *sql.DB, ID int) (p Product, err error)
}

このインターフェイスの実際のバージョンとモック バージョンを実装します:

// Real implementation
type ProductStore struct{}

func (ProductStore) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    // ...
}

// Mock implementation
type ProductRepositoryMock struct {}

func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    // ...
}

ProductRepository に依存するコードを渡すことができるようになりました実稼働用の実際の実装とテスト用のモック実装。

インターフェイス模倣

または、*sql.DB のメソッドを模倣するインターフェースを定義し、そのインターフェース型を関数のパラメーター型として使用します。

type DBIface interface {
    Query(query string, args ...interface{}) (*sql.Rows, error)
    // ...
}

type DBMock struct {}

func (DBMock) Query(query string, args ...interface{}) (*sql.Rows, error) {
    // ...
}

func GetProductByName(DB DBIface, name string) (p Product, err error) {
    // ...
}

これにより、 DB パラメーターはモック可能です。

以上がGolang で関数を効果的にモックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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