GRPC Java登录测试

GRPC Java登录测试,java,spring,exception,grpc,grpc-java,Java,Spring,Exception,Grpc,Grpc Java,因此,我正在使用grpc testin库进行一些集成测试。当我使用此代码时: @Rule public final GrpcCleanupRule grpcCleanup = new GrpcCleanupRule(); @Test public void doTest() throws IOException { String serverName = InProcessServerBuilder.generateName(); grpcCleanup.re

因此,我正在使用grpc testin库进行一些集成测试。当我使用此代码时:

@Rule
public final GrpcCleanupRule grpcCleanup = new GrpcCleanupRule();

@Test
public void doTest() throws IOException {
        String serverName = InProcessServerBuilder.generateName();

        grpcCleanup.register(InProcessServerBuilder
                .forName(serverName).directExecutor().addService(service).build().start());

        SomeServerGrpc.SomeServerBlockingStub blockingStub = SomeServerGrpc.newBlockingStub(
                grpcCleanup.register(InProcessChannelBuilder.forName(serverName).directExecutor().build()));

...
每当代码中出现异常时,我都会

io.grpc.StatusRuntimeException: UNKNOWN

    at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:233)
    at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:214)
    at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:139)

如何让grpc返回异常的真实原因,而不仅仅是
UNKNOWN

好的,我终于找到了一种方法:

grpcCleanup.register(InProcessServerBuilder.forName(serverName).intercept(si).directExecutor().addService(service).build().start());

private ServerInterceptor si=new ServerInterceptor(){
@凌驾
public ServerCall.Listener interceptCall(ServerCall调用、元数据头、ServerCallHandler-next){
ServerCall wrappedCall=new ForwardingServerCall.SimpleForwardingServerCall(调用){
@凌驾
公共无效发送消息(响应消息){
super.sendMessage(message);
}
@凌驾
公共作废关闭(状态、元数据){
System.out.println(“拦截器:+(status.getCause()==null?”null):status.getCause().getClass().getName());
if(status.getCode()==status.Code.UNKNOWN
&&status.getDescription()==null
&&status.getCause()!=null){
Throwable e=status.getCause();
status=status.INTERNAL
.withDescription(如getMessage())
.增强描述(stacktraceToString(e));
}
超级。关闭(状态,拖车);
}
};
返回next.startCall(wrappedCall,headers);
}
私有字符串stacktraceToString(可丢弃的e){
StringWriter StringWriter=新StringWriter();
PrintWriter PrintWriter=新的PrintWriter(stringWriter);
e、 printStackTrace(printWriter);
返回stringWriter.toString();
}
};

根本原因是故意剥离的:。您可以随意打开一个功能请求,以获得传播完整原因的选项。
private ServerInterceptor si = new ServerInterceptor() {

        @Override
        public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) {
            ServerCall<ReqT, RespT> wrappedCall = new ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(call) {
                @Override
                public void sendMessage(RespT message) {
                    super.sendMessage(message);
                }

                @Override
                public void close(Status status, Metadata trailers) {
                    System.out.println("Interceptor: " + (status.getCause() == null ? "null" : status.getCause().getClass().getName()));
                    if (status.getCode() == Status.Code.UNKNOWN
                            && status.getDescription() == null
                            && status.getCause() != null) {
                        Throwable e = status.getCause();
                        status = Status.INTERNAL
                                .withDescription(e.getMessage())
                                .augmentDescription(stacktraceToString(e));
                    }
                    super.close(status, trailers);
                }
            };

            return next.startCall(wrappedCall, headers);
        }

        private String stacktraceToString(Throwable e) {
            StringWriter stringWriter = new StringWriter();
            PrintWriter printWriter = new PrintWriter(stringWriter);
            e.printStackTrace(printWriter);
            return stringWriter.toString();
        }
    };