gpt4 book ai didi

unit-testing - 为什么我们使用接口(interface)来模拟 Golang 方法

转载 作者:行者123 更新时间:2023-12-01 21:17:25 25 4
gpt4 key购买 nike

我是 Golang 的新手,一直在探索但不清楚单元测试中的模拟。谁能解释以下具体问题?
问题1 :在 Golang 中编写单元测试,为什么我们需要模拟方法的接口(interface),为什么不只是 struct ?
问题2 : 为什么我们在结构中注入(inject)接口(interface)(我们调用外部方法)
使用结构 -

type GlobalData struct {}

var (
GlobalObj = GlobalData{}
)

func (g GlobalData) GetGlobalData(a string) string{
return a
}
带有接口(interface)定义-
type GlobalInterface interface {
GetGlobalData(a string) string
}

type GlobalData struct {}

var (
GlobalObj = GlobalData{}
)

func (g GlobalData) GetGlobalData(a string) string{
return a
}
谢谢

最佳答案

问题一 :在 Golang 中编写单元测试,为什么我们需要模拟方法的接口(interface),为什么不只是 struct ?
答:不是强制性的
问题2 : 为什么我们在结构中注入(inject)接口(interface)(我们调用外部方法)
答:因为,它可以帮助您替换实际的函数调用(作为单元测试的一部分,可能会触发一些超出范围的操作,例如 数据库调用 一些 API 调用 等) 通过注入(inject) MockStruct (这将实现与实际代码中相同的 interface)。 多态性用简单的话来说。
所以,你创建一个 MockStruct并定义您自己的mockMethods给它。作为多态性,您的单元测试选择 MockStruct没有提示。调用实际 DB 或 http端点不属于 单元测试 .
仅供引用,我可以将您指向我的一个 github 代码库,我在其中编写了 small test case对于 a file .如您所见,我 mock :

  • GuestCartHandler interface ,这让我不能调用actual implementation
  • mock sql connection使用 "github.com/DATA-DOG/go-sqlmock"包裹。这帮助我避免建立实际的 db client (因此,单元测试时不依赖数据库)

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

    关于unit-testing - 为什么我们使用接口(interface)来模拟 Golang 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63378179/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com