登录
首页 >  Golang >  Go问答

Golang猴子补丁

来源:Golang技术栈

时间:2023-03-30 09:43:15 362浏览 收藏

大家好,我们又见面了啊~本文《Golang猴子补丁》的内容中将会涉及到golang等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我知道如果 go 代码的结构使得它被编程为接口,那么模拟是微不足道的;但是,我正在使用无法更改的代码库(这不是我的),但事实并非如此。

这个代码库是高度互连的,没有任何东西被编程到接口,只有结构,所以没有依赖注入。

结构本身只包含其他结构,所以我也不能这样模拟。我不相信我可以对方法做任何事情,而且存在的少数函数不是变量,所以我不知道将它们换掉。继承在 golang 中不是一回事,所以这也是不行的。

在像 python 这样的脚本语言中,我们可以在运行时修改对象,也就是猴子补丁。我可以在 golang 中做一些类似的事情吗?试图找出某种方法来测试/基准测试而不触及底层代码。

正确答案

当我遇到这种情况时,我的方法是使用我自己的接口作为允许在测试中进行模拟的包装器。例如。

type MyInterface interface {
    DoSomething(i int) error
    DoSomethingElse() ([]int, error)
}

type Concrete struct {
    client *somepackage.Client
}

func (c *Concrete) DoSomething(i int) error {
    return c.client.DoSomething(i)
}

func (c *Concrete) DoSomethingElse() ([]int, error) {
    return c.client.DoSomethingElse()
}

现在,您可以像模拟somepackage.Client接口一样模拟 Concrete。

正如@elithrar在下面的评论中指出的那样,您可以嵌入要模拟的类型,因此您只需要添加需要模拟的方法。例如:

type Concrete struct {
    *somepackage.Client
}

这样做后,DoSomethingNotNeedingMocking可以直接调用其他方法,Concrete而无需将其添加到接口/模拟出来。

今天带大家了解了golang的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表