how to gomock a server streaming grpc method?

356 Views Asked by At

I tried using the following code but the client hangs and never receives from the mock server. I thought this part: Do(rs.EXPECT().Send(&proto.Response{Result: "steve"})would make the mock server response to the client, it never worked out.

For a server-streaming grpc mock, a typical approach like:

mockServer.EXPECT().FetchResponse(&proto.Request{Id: 123}, rs).Times(1).Return(...)

doesn't work, the return value is expected to be an error, not a streaming message.

Could someone with a kind heart please explain how this problem should be handled properly?

Code

func Test_Streaming(t *testing.T) {
    // create listiner
    lis, err := net.Listen("tcp", ":50005")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    // create grpc server
    s := grpc.NewServer()
    c := gomock.NewController(t)
    mockServer := mock_proto.NewMockStreamServiceServer(c)
    proto.RegisterStreamServiceServer(s, mockServer)

    go func() {
        log.Println("start server")
        // and start...
        if err := s.Serve(lis); err != nil {
            log.Fatalf("failed to serve: %v", err)
        }
    }()
    rs := mock_proto.NewMockStreamService_FetchResponseServer(c)
    mockServer.EXPECT().FetchResponse(&proto.Request{Id: 123}, rs).Times(1).Do(rs.EXPECT().Send(&proto.Response{Result: "steve"}))
    // client call FetchResponse
    ClientConnect()
}
0

There are 0 best solutions below