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

効果的なテストのために Go で関数をモックするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 09:15:14633ブラウズ

How Can I Mock Functions in Go for Effective Testing?

Go でモック可能な関数を作成する方法

Go では、具象型内で宣言された特定の関数をモックすることは実現できません。ただし、テストを容易にするために自由に使用できるオプションがいくつかあります。

関数値のモック

変数、構造体フィールド、または関数パラメーターとして存在する関数値は、Go でモック化できます。次の点を考慮してください。

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())

これらのそれぞれのケースで、Fn はモック可能です。

インターフェースの利用

インターフェースは、Go でモックするための効果的かつ推奨される手段を提供します。次の例を考えてみましょう。

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) {
    q := "SELECT * FROM product WHERE id = ?"
    // ...
}

// Mock implementation
type ProductRepositoryMock struct {}

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

ProductRepository に依存するコードは、通常の実行には ProductStore を利用し、テスト目的には ProductRepositoryMock を利用できます。

インターフェイスを介した関数の調整

ほとんどの機能を保持するには関数の元の構造をモック化しながら、関数に渡される型のメソッドをミラーリングするインターフェイスを作成します。次に、インターフェイスの両方のモック バージョンを実装し、テスト中にそれを利用します。

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) {
   ...
}

GetProductByName の DB パラメーターがモック可能になりました。

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

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