使用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
相关产品推荐
相关产品推荐

