You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:45:38