我有gRPC服务(比如svc1(,它使用它的gRPC存根(比如svc2_client(调用另一个gRPC服务。
我已经为svc2_client生成了客户端模拟。根据文档的单元测试工作正常,即使用生成的模拟测试svc2_client。
但是,我有 svc1,如下所示:
// Synonymous to proto service generated.
type Svc1 struct {
rt svc2pb.Svc2Client
}
// Constructor to get Service.
func NewSvc1(rt svc2pb.Svc2Client) *Svc1 {
return &Svc1{rt}
}
...
...
预期行为:
期望它成功
重现
重现行为的步骤:
返回错误:
=== RUN TestMethod1Svc1
TestMethod1Svc1: svc1.go:40: Unexpected call to *mock_svc2client.MockSvc2Client.Method1([context.Background.WithDeadline(2020-06-22 10:14:25.620736 +0530 IST m=+3.002262784 [2.999757626s]) key1:"1" } ]) at ...server/mocks/svc2client_mock.go:65 because: there are no expected calls of the method "Method1" for that receiver
--- FAIL: TestMethod1Svc1 (0.00s)
围棋新手,你能帮我一下吗?
附加信息:
- 戈莫克模式(来源(:来源
- Gomock 版本或 git 参考: github.com/golang/mock v1.4.3 Golang版本
- :Go版本Go1.14达尔文/AMD64
您正在尝试调用尚未被模拟的函数。
基本上,当你执行一个mock_client并调用其中的函数时,你必须确保函数也被模拟。 您还必须为模拟函数提供自定义输入和自定义输出。
你可以参考这个: gomock-blog
您可以看到此行crankingCircuit.EXPECT().RotateShaft().Return(nil).Times(2)
告诉mock_client期待函数的调用RotateShaft
根据 API 的不同,您必须更改模拟函数中的输入参数和输出参数。
也可能有这种情况,我忘了调用mock()
函数。
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.mock(tt.input)
s := NewServiceServer(dbObject, queueObject)
_, err := s.ListConstraint(ctx, tt.input)
if (err != nil) != tt.isErr {
t.Errorf("ServiceServer.ListC() error = %v, wantErr %v", err, tt.isErr)
return
}
})
}