我有一个用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拦截器中的空检查处理?
多谢
1条答案
按热度按时间mspsb9vt1#
看一看https://github.com/grpc/grpc-java/blob/master/api/src/test/java/io/grpc/ServerInterceptorsTest.java或https://github.com/grpc/grpc-java/blob/master/core/src/test/java/io/grpc/util/UtilServerInterceptorsTest.java,了解如何测试服务器拦截器。
关于
null
,grpc框架不会在call
或next
中传递null,所以我看不出有任何理由进行检查。