unit-testing - 意外调用模拟(gomock)gRPC

原文 标签 unit-testing go grpc grpc-go gomock

我有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)

Go中的新手,您能帮我吗?
附加信息:
  • gomock模式(源):源
  • gomock版本或git ref:github.com/golang/mock v1.4.3
  • golang版本:go版本go1.14 darwin / amd64
  • 最佳答案

    您正在尝试调用尚未模拟的函数。
    基本上,执行mock_client并在其中调用函数时,必须确保对这些函数也进行了模拟。
    您还必须为模拟函数提供自定义输入和自定义输出。
    您可以参考:gomock-blog
    你可以看到这行 crankingCircuit.EXPECT().RotateShaft().Return(nil).Times(2)告诉 mock 客户端期望函数RotateShaft的调用
    根据API的不同,您将不得不在模拟函数中更改输入参数和输出参数。

    相关文章:

    c# - 如何对具有验证器的简单属性进行单元测试?

    unit-testing - 您如何在大型项目中构建NUnit测试?

    go - Golang运算符&^工作细节

    casting - 使用Golang绑定(bind)在libtorrent中强制转换“警报”类型

    c# - 如何使用grpc通过服务器在客户端之间发送消息?

    sql - Oracle PL / SQL的单元测试框架?

    unit-testing - 如今,NUnit是否为每个包含的测试方法创建测试夹具类的新实例?

    unicode - Go(golang)是否实际上允许在变量名中使用unicode字符?

    c# - 如何从SslCredentials和 token 字符串创建CallCredentials

    go - 如何在grpc的状态错误对象的详细信息中发送自定义原型(prototype)