GoLang无需修改遗留代码时如何Mock结构体方法内部调用的成员方法
针对你提到的不可修改的遗留Go代码,要mockcreateresource内部的createsubresource调用,目前最常用的可行方案是使用猴子补丁工具直接替换方法实现,具体操作如下:
方案:使用gomonkey猴子补丁库(无需修改原业务代码)
Go语言本身没有提供官方的方法mock能力,对于不能修改的遗留代码,可以用生态成熟的gomonkey库在测试运行时动态替换方法的实现。
操作步骤
- 安装依赖:
go get github.com/agiledragon/gomonkey/v2 go get github.com/stretchr/testify
- 编写测试用例:
package yourpackage import ( "reflect" "testing" "github.com/agiledragon/gomonkey/v2" "github.com/stretchr/testify/assert" ) func TestTest_CreateResource(t *testing.T) { // 初始化原结构体实例 testObj := &test{} // 给createsubresource方法打补丁,替换为你需要的mock逻辑 patch := gomonkey.ApplyMethod(reflect.TypeOf(testObj), "createsubresource", func(_ *test, res1 string) error { // 这里可以加参数校验、自定义返回值等mock逻辑 assert.Equal(t, "expected_res1_value", res1) return nil }) // 测试执行完成后卸载补丁,避免影响其他测试用例 defer patch.Reset() // 调用待测试的createresource方法 err := testObj.createresource("expected_res1_value", "res2_value") // 校验返回结果是否符合预期 assert.NoError(t, err) }
注意事项
运行测试时需要关闭Go的内联优化,否则补丁可能无法生效,测试命令为:
go test -gcflags=all=-l
如果不想引入第三方依赖,目前没有不修改原代码的其他方案——因为原createresource方法是绑定到test结构体的,内部对createsubresource的调用是静态绑定的,不通过反射或者补丁的方式无法替换实现。
内容的提问来源于stack exchange,提问作者Nilesh Salunkhe
相关产品推荐
相关产品推荐

