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

使用Testify Mock实现返回入参的Go函数单元测试问题

解决Testify Mock返回传入参数的问题

你的问题根源在于Testify Mock的Return方法会在Mock初始化阶段就确定返回值,而Run中的逻辑仅在调用Mock方法时执行,所以初始的nil被固定为返回值,导致断言失败。

以下是两种符合接口契约的解决方案:

方案一:用匿名函数动态返回传入参数

直接在Return中传入匿名函数,让返回值在Mock方法被调用时才计算,确保拿到实际传入的参数:

func TestDoer(t *testing.T) {
    request := &doer.Something{
        Message: "foo",
    }

    sut := mocks.Doer{}
    sut.On("DoSomething", mock.Anything).Return(func(s *doer.Something) *doer.Something {
        return s
    })

    r := sut.DoSomething(request)

    assert.Equal(t, request.Message, r.Message)
}

方案二:通过Arguments获取参数返回

如果需要在返回前模拟业务逻辑(比如Bun ORM持久化后的字段修改),可以通过Arguments获取传入的参数后处理再返回:

func TestDoer(t *testing.T) {
    request := &doer.Something{
        Message: "foo",
    }

    sut := mocks.Doer{}
    sut.On("DoSomething", mock.Anything).Return(func(args mock.Arguments) *doer.Something {
        // 模拟数据库持久化后的修改逻辑
        s := args.Get(0).(*doer.Something)
        s.Message = s.Message + "_persisted"
        return s
    })

    r := sut.DoSomething(request)

    assert.Equal(t, "foo_persisted", r.Message)
}

这两种方式都严格遵守原接口的契约,既保留了接收指针参数、返回指针的逻辑,又解决了Mock返回值为nil的问题。

内容的提问来源于stack exchange,提问作者beni0888

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:42:51