Go 中的猴子修补:不可更改代码库的解决方案
使用未编程到接口且高度互连的代码库可以呈现测试和基准测试的挑战。在这种情况下,传统的模拟技术可能不适用。然而,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() }
在这种情况下,Concrete 是您无法修改的代码。通过创建 MyInterface 接口并嵌入原始 Concrete 结构,您可以灵活地在测试中模拟其方法:
// Replace the embedded type with a mock in tests type MockConcrete struct { MyInterface } func (m *MockConcrete) DoSomething(i int) error { // Implement custom logic for mocking DoSomething }
此方法提供了一种无需修改底层代码即可测试特定功能的方法。
或者,按照评论中的建议,您也可以直接嵌入所需的类型,而不是创建单独的接口。这允许您有选择地仅模拟您需要的方法:
type Concrete struct { *somepackage.Client }
此策略保留了直接在嵌入类型上访问非模拟方法的能力,为测试提供了更大的灵活性。
以上是Monkey Patching 能否解决 Go 不可更改的代码库测试问题?的详细内容。更多信息请关注PHP中文网其他相关文章!