[Go][gRPC]mock初体验
Posted jiayoupaofu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Go][gRPC]mock初体验相关的知识,希望对你有一定的参考价值。
方法1:使用monkey包,直接对pb.go里面的方法进行mock
1 package assetengine 2 3 import ( 4 "context" 5 "fmt" 6 "reflect" 7 8 "bou.ke/monkey" 9 //"golang.org/x/net/context" 10 "google.golang.org/grpc" 11 ) 12 13 func AddMonkey() { 14 var c *apiClient 15 16 add := monkey.PatchInstanceMethod(reflect.TypeOf(c), 17 "AddItemQuantity", 18 func(_ *apiClient, ctx context.Context, in *AddItemQuantityRequest, opts ...grpc.CallOption) (*AddItemQuantityReply, error) { 19 fmt.Printf("mock AddItemQuantity start ") 20 rs := Result{Code: ERROR_SHIELD_REJECT, Info: "mock result"} 21 // fmt.Printf %v : 以更好的格式输出 22 fmt.Printf("AddItemQuantity v %v ", rs) // AddItemQuantity v {SHIELD_REJECT mock result} 23 // fmt.Printf %#v :直接输出错误码 24 fmt.Printf("AddItemQuantity resp code %#v ", rs) //AddItemQuantity resp code assetengine.Result{Code:402, Info:"mock result"} 25 // 只输出错误描述 26 fmt.Printf("只输出错误描述 %v ", rs.Code) // 只输出错误描述 SHIELD_REJECT 27 // 只输出错误码 28 fmt.Printf("justcode %#v ", rs.Code) // justcode 402 29 return &AddItemQuantityReply{&rs}, nil 30 }) 31 fmt.Printf("add %#v ", add) 32 33 }
调用方式:
1 func Test_mock_adduservas(t *testing.T) { 2 pb.AddMonkey() 3 c := pb.NewApiClient(nil) 4 res, _ := c.AddItemQuantity(context.Background(), &pb.AddItemQuantityRequest{}) 5 fmt.Printf("test resp %#v ", res.Result) 6 7 }
方法2:使用gomock工具对.proto文件进行mock,生成mock代码
命令:mockgen -source sourcefilename.go > targetfilename.go
生成mock代码后调用如下:
1 package mock_assetengine 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/golang/mock/gomock" 8 ) 9 10 func Test_mockgrpc(t *testing.T) { 11 12 res := Result{ 13 Code: ERROR_SHIELD_REJECT, 14 Info: "mock result", 15 } 16 ctrl := gomock.NewController(t) 17 defer ctrl.Finish() 18 19 // 这里mock的是 ApiClient 和 ApiServer 20 // 在mock文件里分别对应 21 // ApiClient -> NewMockApiClient 22 // ApiServer -> NewMockApiServer 23 // 查找备注 creates a new mock instance 24 mockApiClient := NewMockApiClient(ctrl) 25 mockApiClient.EXPECT().AddItemQuantity( 26 gomock.Any(), 27 gomock.Any(), 28 ).Return(&AddItemQuantityReply{&res}, nil) 29 testMock(t, mockApiClient) 30 } 31 32 func testMock(t *testing.T, client ApiClient) { 33 t.Helper() 34 resp, _ := client.AddItemQuantity(context.Background(), &AddItemQuantityRequest{}) 35 t.Log("Reply : ", resp) 36 }
运行结果:
以上是关于[Go][gRPC]mock初体验的主要内容,如果未能解决你的问题,请参考以下文章