首页 >后端开发 >Golang >如何在 Go 中实现类似于猴子修补的行为以简化测试?

如何在 Go 中实现类似于猴子修补的行为以简化测试?

DDD
DDD原创
2024-12-08 17:19:10632浏览

How Can I Achieve Monkey Patching-like Behavior in Go for Easier Testing?

Go 中的猴子修补:一种在运行时修改对象的方法

在 Go 中,当使用缺乏接口的高度互连的代码库时由于无法模拟或交换组件,依赖注入、测试或基准测试可能会变得具有挑战性。然而,有一些类似于 Python 等脚本语言中的猴子修补技术,使您能够在 Go 中运行时修改对象。

一种方法是创建一个自定义接口来包装原始对象并允许在测试中进行模拟。例如,如果您有一个名为 Concrete 的结构,它依赖于名为 somepackage 的包:

type Concrete struct {
    client *somepackage.Client
}

您可以使用所需的方法定义自己的接口 MyInterface:

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

然后,在模拟对象中实现此接口:

type MockConcrete struct {
    DoSomethingCalled bool
    DoSomethingElseCalled bool
}

func (m *MockConcrete) DoSomething(i int) error {
    m.DoSomethingCalled = true
    return nil
}

func (m *MockConcrete) DoSomethingElse() ([]int, error) {
    m.DoSomethingElseCalled = true
    return []int{}, nil
}

在您的测试中,您可以将模拟对象注入到 Concrete 中并验证其行为:

func TestDoSomething(t *testing.T) {
    mockConcrete := &MockConcrete{}
    c := &Concrete{client: mockConcrete}

    c.DoSomething(42)

    if !mockConcrete.DoSomethingCalled {
        t.Error("DoSomething was not called")
    }
}

另一种技术是将您想要模拟的类型嵌入到您自己的结构中。这允许您覆盖所需的模拟方法,同时保留对原始对象的其他方法的访问。例如:

type Concrete struct {
    *somepackage.Client
}

通过这种方法,您可以直接调用非重写方法,例如 Concrete 上的 DoSomethingNotNeedingMocking,而无需模拟它们。

以上是如何在 Go 中实现类似于猴子修补的行为以简化测试?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn