当前位置: 首页 > 知识库问答 >
问题:

grpc测试代码出口1带有“rpc错误:代码=未实现描述=方法Hello未实现”

百里阳平
2023-03-14

环境

go version go1.17.4 linux/amd64

libprotoc 3.6.1

问题

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

错误

$ 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

密码

你好原型

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)
}

共有1个答案

孔才
2023-03-14

在测试中,您正在调用pb。注册服务器,

您必须在服务器结构上实现Hellorpc:

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

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

 类似资料:
  • 本文向大家介绍Spring Boot Hello World的实现代码,包括了Spring Boot Hello World的实现代码的使用技巧和注意事项,需要的朋友参考一下 本篇文章是SpringBoot最入门的介绍。我们不借助任何额外的工具,从无到有创建一个Spring Boot的web项目,并运行这个项目。 项目构建 归根结底,Spring Boot就只是一个框架,几个jar而已,没什么神奇

  • 代码入口 applicationContext-web.xml 文件路径: pinpoint/web/src/main/resources/applicationContext-web.xml 导入的配置文件有hbase.properties和jdbc.properties: <bean id="propertyConfigurer" class="org.springframework.bean

  • 我有一个Android项目,它在构建时从proto文件生成gRPC类,在helloworld示例下:https://github.com/grpc/grpc-java/tree/master/examples/src 我的JUnit测试遵循为HelloWorldClient编写的测试(https://github.com/grpc/grpc-java/blob/master/examples/ex

  • 本文向大家介绍Python实现简易端口扫描器代码实例,包括了Python实现简易端口扫描器代码实例的使用技巧和注意事项,需要的朋友参考一下 在网上的一些资料的基础上自己又添了些新内容,算是Python socket编程练手吧。 使用效果如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 实现Run 实现Flock 前面提到进程的文件锁,实际上Run也用到了,可以试想下以下的场景。 用户A执行run pt-summary,由于本地已经缓存了所以会直接运行本地的脚本。同时用户B执行run -u pt-summary,加上-u或者--update参数后Run会从远端下载并运行最新的脚本。如果不加文件锁的话,用户A的行为就不可预测了,而文件锁很好得解决了这个问题。 具体使用方法如下,我们

  • #coding=utf-8 ''''' ''' from math import log import operator def createDataSet(): dataSet =[[1,1,'yes'], [1,1,'yes'], [1,0,'no'], [0,1