使用Testify Mock gRPC客户端遇接口实现错误,如何控制迭代响应?
问题解答
你没有正确Mock gRPC客户端
错误原因
这个错误的核心是gRPC生成的客户端接口要求所有方法的接收器必须是指针类型,但你的clientMock要么是用值接收器实现接口方法,要么在注入Mock时传递的是值而非指针实例。
Go的类型系统里,值类型的方法集不包含指针接收器的方法,而gRPC自动生成的pb.UserServiceClient接口中,所有方法(比如UpdateUser)的接收器都是指针类型。这就导致你的clientMock值无法满足接口要求,编译器判定它没有实现pb.UserServiceClient。
修复步骤
- 给Mock结构体的方法用指针接收器
定义clientMock的所有接口方法时,接收器必须是*clientMock,比如:func (m *clientMock) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest, opts ...grpc.CallOption) (*pb.UpdateUserResponse, error) { args := m.Called(ctx, req, opts) return args.Get(0).(*pb.UpdateUserResponse), args.Error(1) } func (m *clientMock) GetUser(ctx context.Context, req *pb.GetUserRequest, opts ...grpc.CallOption) (*pb.GetUserResponse, error) { args := m.Called(ctx, req, opts) return args.Get(0).(*pb.GetUserResponse), args.Error(1) } - 注入Mock时传递指针实例
在测试代码里创建Mock对象时,必须用指针而非值:mockClient := &clientMock{} // 将这个指针注入到业务逻辑中
完成以上调整后,你就能正常用Testify Mock的Once()、Times()特性控制GetUser的多次调用响应了,比如:
// 第一次调用GetUser返回ID为1的用户 mockClient.On("GetUser", mock.Anything, mock.Anything).Return(&pb.GetUserResponse{Id: 1}, nil).Once() // 第二次调用返回ID为2的用户 mockClient.On("GetUser", mock.Anything, mock.Anything).Return(&pb.GetUserResponse{Id: 2}, nil).Once()
内容的提问来源于stack exchange,提问作者DevFromI
相关产品推荐
相关产品推荐

