首页 > 后端开发 > Golang > 如何在Go中达到Monkey Patching的效果进行测试和基准测试?

如何在Go中达到Monkey Patching的效果进行测试和基准测试?

Linda Hamilton
发布: 2024-12-11 12:26:11
原创
723 人浏览过

How Can I Achieve the Effect of Monkey Patching in Go for Testing and Benchmarking?

Go 中的猴子修补

在 Go 编程语言中,在处理不围绕接口构建的代码时,模拟可能具有挑战性。当结构直接互连并且不存在依赖注入时,它会阻碍在不修改底层代码的情况下有效测试和基准测试的能力。

从像 Python 这样的脚本语言中可能想到的一种技术是猴子修补,其中对象可以在运行时修改。虽然 Go 没有直接对象修改的等效机制,但有其他方法可以实现类似的结果。

一种常见策略是创建自己的接口作为您希望模拟的结构的包装器。这允许您在接口方法中实现所需的行为,同时保留底层结构中的原始功能。例如:

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

通过实现 MyInterface,您现在可以为测试创建模拟实现:

// MockMyInterface implements MyInterface for testing purposes
type MockMyInterface struct {
    mockedDoSomethingError error
    mockedDoSomethingElseResult []int
}

func (m *MockMyInterface) DoSomething(i int) error {
    return m.mockedDoSomethingError
}

func (m *MockMyInterface) DoSomethingElse() ([]int, error) {
    return m.mockedDoSomethingElseResult, nil
}
登录后复制

@elithrar 在评论中建议的另一种方法是嵌入您希望在自己的结构中模拟的类型。这允许您有选择地仅模拟需要它的方法:

type Concrete struct {
    *somepackage.Client
}
登录后复制

通过嵌入 Client,您可以直接调用 DoSomethingNotNeedingMocking 等方法,而无需将它们添加到接口或为它们创建模拟。

这些技术为猴子修补提供了可行的替代方案,用于测试和基准测试不围绕接口构建的代码。

以上是如何在Go中达到Monkey Patching的效果进行测试和基准测试?的详细内容。更多信息请关注PHP中文网其他相关文章!

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