如何使用 Go 中的方法模拟虚拟 grpc 服务
我需要为一个函数编写一个单元测试,该函数在其源代码中调用不同 gRPC 服务的 gRPC 方法。我的测试结果出现严重错误,因为 gRPC 服务未在我的计算机上运行。我想在测试中创建一个虚拟服务,并且该服务必须为源代码内的方法调用提供服务。我该怎么做?
编辑:详细信息 源函数:
func (s *mainType) MainGenerateBearerToken(inputs...)(output) {
response, err := s.Subtype.SubGenerateBearerToken(context, authnPass, ttl)
if err != nil {
return nil, err
}
return &models.OCITokenResponse{Token: response.Token, ExpiresIn: ttl}, nil
}
func(cl *Subtype) SubGenerateBearerToken(context,authnPass, ttl) (*BearerTokenResponse, error) {
resp,err := pb.NewGrpcClient(cl.Conn).GetBearerToken_grpc(ctx, &pb.GetBearerTokenRequest{AuthnToken, BearerTtlValue:ttlNum)
return &BearerTokenResponse{Token}, err
}
我正在为 MainGenerateBearerToken() 函数编写测试,该函数调用 SubGenerateBearerToken(),其中调用 grpc 方法。
I need to write a unit test for a function, which in its source code calls a gRPC method of a different gRPC service. My test results in a panic error because that gRPC service is not running on my machine. I want to create a dummy service in my test and that service must serve the method calling inside the source code. How do I do that?
Edit: Details
Source function:
func (s *mainType) MainGenerateBearerToken(inputs...)(output) {
response, err := s.Subtype.SubGenerateBearerToken(context, authnPass, ttl)
if err != nil {
return nil, err
}
return &models.OCITokenResponse{Token: response.Token, ExpiresIn: ttl}, nil
}
func(cl *Subtype) SubGenerateBearerToken(context,authnPass, ttl) (*BearerTokenResponse, error) {
resp,err := pb.NewGrpcClient(cl.Conn).GetBearerToken_grpc(ctx, &pb.GetBearerTokenRequest{AuthnToken, BearerTtlValue:ttlNum)
return &BearerTokenResponse{Token}, err
}
I'm writing test for the MainGenerateBearerToken() function, which calls SubGenerateBearerToken(), inside which the grpc method is called.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
gRPC 服务客户端是一个常规的 Go 接口。
您可以使用 gomock 或 moq 为任何 Go 接口生成模拟。
或者
这将生成实现
MyServiceClient
的mock.MyServiceClientMock
。然后您可以在单元测试中使用它而不是真正的 gRPC 客户端。使用起订量的完整示例:
my_service.proto
:main.go
:main_test.go
:运行:
A gRPC service client is a regular Go interface.
You can use tools like gomock or moq to generate a mock for any Go interface.
Or
That will generate
mock.MyServiceClientMock
that implementsMyServiceClient
. Then you can use it in your unit tests instead of the real gRPC client.Complete example using moq:
my_service.proto
:main.go
:main_test.go
:To run:
如果适合在 SubGenerateBearerToken 方法中删除 grpc 客户端创建(例如,将其保留在子类型中或作为参数传递),您可以轻松创建一个简单的假客户端:
If it's appropriate to get rid of the grpc client creation in the SubGenerateBearerToken method (e.g. keep it in the Subtype or pass as an arg) you could easily create a simple fake client: