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中文网其他相关文章!