【问题标题】:grpc testing code exit 1 with 'rpc error: code = Unimplemented desc = method Hello not implemented'grpc 测试代码退出 1 并出现“rpc 错误:代码 = 未实现的 desc = 方法 Hello 未实现”
【发布时间】:2022-01-15 04:50:49
【问题描述】:

环境

go version go1.17.4 linux/amd64

libprotoc 3.6.1

问题

我正在测试 Go 实现的 grpc 服务器和客户端。
首先,我做了 proto 定义并通过 protoc 命令生成 pb 代码。 我提到了这个solution。 以下错误由最小代码打印以重现我的错误。

错误

$ go test
--- FAIL: TestHello (0.00s)
    main_test.go:49: failed to Hello: rpc error: code = Unimplemented desc = method Hello not implemented
FAIL
exit status 1
FAIL    github.com/Asuha-a/test/test    0.003s

代码

hello.proto

syntax = "proto3";

option go_package = "github.com/Asuha-a/test/pb";

package hello;

service Hello {
  rpc Hello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string foo = 1;
}

message HelloReply {
  string bar = 1;
}

main_test.go

package hello_test

import (
    "context"
    "log"
    "net"
    "testing"

    "github.com/Asuha-a/test/pb"
    "google.golang.org/grpc"
    "google.golang.org/grpc/test/bufconn"
)

type server struct {
    pb.UnimplementedHelloServer
}

const bufSize = 1024 * 1024

var lis *bufconn.Listener

func init() {
    lis = bufconn.Listen(bufSize)
    s := grpc.NewServer()
    pb.RegisterHelloServer(s, &server{})
    go func() {
        if err := s.Serve(lis); err != nil {
            log.Fatalf("server exited with error: %v", err)
        }
    }()
}

func bufDialer(context.Context, string) (net.Conn, error) {
    return lis.Dial()
}

func TestHello(t *testing.T) {
    ctx := context.Background()
    conn, err := grpc.DialContext(ctx, "bufnet", grpc.WithContextDialer(bufDialer), grpc.WithInsecure())
    if err != nil {
        t.Fatalf("failed to dial bufnet: %v", err)
    }
    defer conn.Close()
    client := pb.NewHelloClient(conn)
    r, err := client.Hello(ctx, &pb.HelloRequest{
        Foo: "foo",
    })
    if err != nil {
        t.Fatalf("failed to Hello: %v", err) //49th line prints the error
    }
    log.Println(r)
}

【问题讨论】:

    标签: go testing grpc grpc-go


    【解决方案1】:

    在您的测试中,您使用server 结构调用pb.RegisterHelloServer(s, &server{})。然而,这个结构只嵌入了pb.UnimplementedHelloServer 并且没有声明任何方法。因此,您只能在调用其任何 RPC 时返回 codes.Unimplemented

    您必须在server 结构上实现Hello rpc:

    func (s *server) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
        return &pb.HelloReply{}, nil
    }
    

    注意: 嵌入 pb.UnimplementedHelloServer 使 gRPC 服务器实现向前兼容,但代价是编译时检查。要放弃前向兼容性并在编译时捕获这些错误,您可以改为嵌入 pb.UnsafeHelloServer

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      相关资源
      最近更新 更多