用Java测试gRPC服务器拦截器的若干问题

7rtdyuoh  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(288)

我有一个用java编写的gRPC拦截器
我的gRPC拦截器如下所示

public class GrpcServerInterceptor implements ServerInterceptor {
    @Override
    public <R, T> ServerCall.Listener<R> interceptCall(ServerCall<R, T> call,
                                                                 Metadata requestHeaders, ServerCallHandler<R, T> next) {

        if(call == null || next == null)
            return null;

        if(call != null) {
            String actionName = call.getMethodDescriptor().getBareMethodName();
            String serviceName = call.getMethodDescriptor().getServiceName();
            State.Holder.set(State.newBuilder().withControllerName(serviceName).withActionName(actionName).withFramework("grpc").build());
        }

        ServerCall.Listener<R> delegate = next.startCall(call, requestHeaders);

        return new ForwardingServerCallListener.SimpleForwardingServerCallListener<R>(delegate) {
            @Override
            public void onHalfClose() {
                try {
                    super.onHalfClose();
                } catch (Exception e) {
                    call.close(Status.INTERNAL
                            .withCause (e)
                            .withDescription("error message"), new Metadata());
                }
            }
        };
    }
}

我只是想在junit中对上述拦截器进行单元测试。
我在构建ServerCall、Metaddata和ServerCallHandler对象以及传递它们时遇到了一些问题。
我尝试在单元测试中创建如下的服务器调用对象。

ServerCall serverCall = new ForwardingServerCall() {
        @Override
        protected ServerCall delegate() {
          return null;
        }

        @Override
        public MethodDescriptor getMethodDescriptor() {
          return MethodDescriptor.newBuilder().
              setType(MethodType.UNKNOWN).
              setRequestMarshaller(ProtoUtils.marshaller((StudentRequest.getDefaultInstance()))).
              setResponseMarshaller(ProtoUtils.marshaller(StudentResponse.getDefaultInstance())).
              setFullMethodName(generateFullMethodName("com.test.cloud.sc.grpc.backend.service.StudentServiceImpl", "getStudentInfo")).
              build();
        }
      };

但是上面的代码块在设置请求和响应编组器方面存在问题。
我怎么能用最少的代码设置单元测试我的拦截器的所有场景,而且我根本不想启动grpc服务器?

编辑1

我如何改进gRPC拦截器中的空检查处理?
多谢

相关问题