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