首页 > 后端开发 > Golang > 如何有效地模拟 Go 中的函数?

如何有效地模拟 Go 中的函数?

Linda Hamilton
发布: 2024-12-06 21:23:14
原创
450 人浏览过

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())
登录后复制

在所有三种情况下,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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板