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

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

Linda Hamilton
リリース: 2024-12-06 21:23:14
オリジナル
447 人が閲覧しました

How Can I Effectively Mock Functions in Go?

Golang での関数のモック

はじめに

Go では、func F() {} など、具象型で宣言された関数をモックします。および func (T) M() {} は不可能です。ただし、同様の機能を実現する他のアプローチもあります。

関数値のモック

Go では、変数に格納されているか、構造体のフィールドとして格納されているかに関係なく、関数値をモックすることができます。他の関数に渡されるパラメータ。たとえば、次のことを考慮してください。

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())
ログイン後にコピー

3 つのケースすべてにおいて、Fn はモック可能です。

インターフェイスのモック

Go でモックするためのより好ましいアプローチは、次のとおりです。インターフェース。例:

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

// The real implementer
type ProductStore struct{}

func (ProductStore) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    q := "SELECT * FROM product WHERE id = ?"
    // ...
}

// The mock implementer
type ProductRepositoryMock struct{}

func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    // ...
}
ログイン後にコピー

ProductRepository に依存するコードは、通常のシナリオでは ProductStore を使用し、テスト中に ProductRepositoryMock を使用できるようになりました。

*sql.DB のモッキング インターフェイス

別の既存の関数宣言を保持できるモックのオプションは、次のメソッドを模倣するインターフェイスを定義することです。 *sql.DB を削除し、代わりにそれを使用してください。例:

type DBIface interface {
    Query(query string, args ...interface{}) (*sql.Rows, error)
    // Only declare methods that are actually used.
}

type DBMock struct{}

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

func GetProductByName(DB DBIface, name string) (p Product, err error) {
    ...
}
ログイン後にコピー

このアプローチでは、GetProductByName への DB パラメーターがモック可能になります。

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

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