Go语言中如何Mock同一结构体内部调用的方法?
解决同一结构体方法Mock的问题
针对你使用testify框架时,想要Mock同一结构体中被Foo调用的Bar方法的需求,这里提供两种可行方案:
方案一:调整代码依赖,通过接口调用Bar
修改Foo方法的实现,不再直接调用自身的Bar,而是通过依赖的MyInterface接口来调用。这样测试时就能传入Mock的接口实例,用Mock版本的Bar替代真实逻辑。
修改后的Foo方法示例:
func (a *MyStruct) Foo(mi MyInterface) bool { fromBar := mi.Bar() return fromBar }
测试代码(基于testify):
import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) type MockMyInterface struct { mock.Mock } func (m *MockMyInterface) Foo() bool { args := m.Called() return args.Bool(0) } func (m *MockMyInterface) Bar() bool { args := m.Called() return args.Bool(0) } func TestFoo(t *testing.T) { mockObj := new(MockMyInterface) mockObj.On("Bar").Return(false) myStruct := &MyStruct{} result := myStruct.Foo(mockObj) assert.False(t, result) mockObj.AssertExpectations(t) }
方案二:通过嵌入结构体重写Bar方法
如果不想改动原有Foo方法的签名,可以创建一个嵌入MyStruct的测试专用结构体,重写Bar方法。这样调用Foo时,会优先执行重写后的Mock版本Bar,而非原结构体的真实方法。
测试代码示例:
import ( "testing" "github.com/stretchr/testify/assert" ) type MockMyStruct struct { *MyStruct BarFunc func() bool } func (m *MockMyStruct) Bar() bool { if m.BarFunc != nil { return m.BarFunc() } return m.MyStruct.Bar() } func TestFoo(t *testing.T) { mockStruct := &MockMyStruct{ MyStruct: &MyStruct{}, BarFunc: func() bool { return false }, } result := mockStruct.Foo() assert.False(t, result) }
这种方式无需修改业务代码,仅在测试逻辑中创建Mock结构体即可实现需求。
内容的提问来源于stack exchange,提问作者Riski Putra Awali
相关产品推荐
相关产品推荐

