Java 如何在没有自定义拦截器的测试中设置上下文

Java 如何在没有自定义拦截器的测试中设置上下文,java,grpc,grpc-java,Java,Grpc,Grpc Java,我尝试编写单元测试,如中所示。事实上,我的服务从context.Key读取一些用户上下文信息(如userID、ip等),这些信息是在一些UserContextInterceptor中设置的。 问题是,我不想在JUnit测试代码中创建相同的拦截器,也不想在测试方法中手动设置上下文,但无法找到正确的方法 我在Constant.java中有一些Context.Key USER\u Context,并尝试下一步设置Context: Context.current().withValue(Constant

我尝试编写单元测试,如中所示。事实上,我的服务从
context.Key
读取一些用户上下文信息(如userID、ip等),这些信息是在一些
UserContextInterceptor
中设置的。 问题是,我不想在JUnit测试代码中创建相同的拦截器,也不想在测试方法中手动设置上下文,但无法找到正确的方法

我在
Constant.java
中有一些
Context.Key USER\u Context
,并尝试下一步设置Context:

Context.current().withValue(Constant.USER_CONTEXT, userContext).run(() -> { // some testing code })
但是,由于运行发生在与调用方线程不同的线程中,从
Constant.USER\u context.get()返回的上下文在服务代码中总是
null

Constant.java

publicstaticfinalcontext.Key USER_Context=Context.Key(“userContext”);
GrpcService.java


@凌驾
公共StreamObserver进程(StreamObserver响应Observer){
返回新的StreamObserver(){
@凌驾
public void onNext(EntityRequest请求){
常量.USER_CONTEXT.get();//在测试中始终为null
}
//其他方法
};
}
GrpcServiceTest.java

@测试
公开无效测试(){
UserContext mockedContext=…;//设置用户上下文
Context.current().withValue(Constant.USER\u Context,mockedContext)
.run(()->{
//测试代码,调用服务rpc方法
});
}

在没有拦截器的测试中设置上下文以使用上下文的正确方法是什么?
GrpcService
中的模拟值没有空值?

问题与使用哪个线程执行无关
Context.run()
在当前线程中运行。而
RouteGuideServerTest
已经使用
serverBuilder.directExecutor()
在测试线程中运行服务


问题是服务器有自己的根
Context
用于入站RPC,与调用时当前线程上的
Context
分开。这需要拦截器进行更改。

问题与使用哪个线程执行无关
Context.run()
在当前线程中运行。而
RouteGuideServerTest
已经使用
serverBuilder.directExecutor()
在测试线程中运行服务


问题是服务器有自己的根
Context
用于入站RPC,与调用时当前线程上的
Context
分开。这需要一个拦截器来改变。

我知道了,非常感谢。您能否告诉我,在服务调用期间设置上下文是否是检索请求范围参数的唯一可能的解决方案?也许gRPC世界中存在一些最佳实践或机制,我只找到了上下文示例。上下文是我们的官方建议。上下文/拦截器是否存在导致您出现问题的问题?拦截器怎么了?我知道了,非常感谢。您能否告诉我,在服务调用期间设置上下文是否是检索请求范围参数的唯一可能的解决方案?也许gRPC世界中存在一些最佳实践或机制,我只找到了上下文示例。上下文是我们的官方建议。上下文/拦截器是否存在导致您出现问题的问题?拦截器有什么问题?