首页 > 解决方案 > 为什么我们使用接口来模拟 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
}

谢谢

标签: unit-testinggostructinterfacemocking

解决方案


问题 1:为了在 Golang 中编写单元测试,为什么我们需要模拟方法的接口,为什么不只是 struct ?

答:不是强制性的

问题 2:为什么我们在 struct 中注入接口(我们调用外部方法)

回答:因为,它可以帮助您通过注入a MockStruct(实现interface与是否存在于实际代码中)。简单的多态性

所以,你创建一个MockStruct并定义你自己mockMethods的。作为多态性,您的单元测试选择MockStruct没有抱怨。调用实际的数据库或http端点不属于单元测试

仅供参考,我可以将您指向我的一个 github 代码库,在那里我为一个文件编写了一个小测试用例。如您所见,我嘲笑:

  1. GuestCartHandlerinterface,这使我可以不调用实际的实现
  2. 使用包模拟sql连接。"github.com/DATA-DOG/go-sqlmock"这帮助我避免建立实际db client的(因此,在单元测试时不依赖数据库)

如果您从概念上理解这个想法,或者您是否需要更多说明,请告诉我。


推荐阅读