unit-testing - 为什么我们使用接口来模拟 Golang 方法
问题描述
我是 Golang 的新手,一直在探索但不清楚单元测试中的模拟。谁能解释以下具体问题?
问题1:在 Golang 中编写单元测试,为什么我们需要有接口来模拟方法,为什么不只有 struct ?
问题2:为什么我们在结构中注入接口(我们称之为外部方法)
使用结构 -
type GlobalData struct {}
var (
GlobalObj = GlobalData{}
)
func (g GlobalData) GetGlobalData(a string) string{
return a
}
带有接口定义-
type GlobalInterface interface {
GetGlobalData(a string) string
}
type GlobalData struct {}
var (
GlobalObj = GlobalData{}
)
func (g GlobalData) GetGlobalData(a string) string{
return a
}
谢谢
解决方案
问题 1:为了在 Golang 中编写单元测试,为什么我们需要模拟方法的接口,为什么不只是 struct ?
答:不是强制性的
问题 2:为什么我们在 struct 中注入接口(我们调用外部方法)
回答:因为,它可以帮助您通过注入a MockStruct
(实现interface
与是否存在于实际代码中)。简单的多态性。
所以,你创建一个MockStruct
并定义你自己mockMethods
的。作为多态性,您的单元测试选择MockStruct
没有抱怨。调用实际的数据库或http
端点不属于单元测试。
仅供参考,我可以将您指向我的一个 github 代码库,在那里我为一个文件编写了一个小测试用例。如您所见,我嘲笑:
GuestCartHandler
interface,这使我可以不调用实际的实现- 使用包模拟
sql
连接。"github.com/DATA-DOG/go-sqlmock"
这帮助我避免建立实际db client
的(因此,在单元测试时不依赖数据库)
如果您从概念上理解这个想法,或者您是否需要更多说明,请告诉我。