为了账号安全,请及时绑定邮箱和手机立即绑定

grpc 测试代码退出 1 并出现“rpc 错误:代码 = 未实现的 desc

grpc 测试代码退出 1 并出现“rpc 错误:代码 = 未实现的 desc

Go
元芳怎么了 2022-10-17 19:20:26
环境go version go1.17.4 linux/amd64libprotoc 3.6.1问题我正在测试 Go 实现的 grpc 服务器和客户端。首先,我做了 proto 定义并通过 protoc 命令生成 pb 代码。我提到了这个解决方案。下面的错误由最小代码打印以重现我的错误。错误$ go test--- FAIL: TestHello (0.00s)    main_test.go:49: failed to Hello: rpc error: code = Unimplemented desc = method Hello not implementedFAILexit status 1FAIL    github.com/Asuha-a/test/test    0.003s代码你好.protosyntax = "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.gopackage hello_testimport (    "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 * 1024var lis *bufconn.Listenerfunc 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)}
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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


您必须在结构上实现Hellorpc server:


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

    return &pb.HelloReply{}, nil

}

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


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号