如何在没有自定义拦截器的情况下在测试中设置上下文
How to set Context in tests without custom interceptors
我尝试编写单元测试,如 RouteGuideServerTest.java 所示。事实上,我的服务从 Context.Key<UserContext>
中读取一些用户上下文信息(如 userID、ip 等),这些信息设置在某些 UserContextInterceptor
中。
问题是我不想在 JUnit 测试代码中创建拦截器,而是想在测试方法中手动设置上下文,但找不到正确的方法。
我在 Constant.java
中有一些 Context.Key<UserContext> USER_CONTEXT
并尝试以下一种方式设置上下文:
Context.current().withValue(Constant.USER_CONTEXT, userContext).run(() -> { // some testing code })
但是由于 运行 发生在与调用者线程不同的线程中,从 Constant.USER_CONTEXT.get()
返回的上下文在服务代码中始终是 null
。
Constant.java:
public static final Context.Key<UserContext> USER_CONTEXT = Context.key("userContext");
GrpcService.java
@Override
public StreamObserver<EntityRequest> process(StreamObserver<EntityResponse> responseObserver) {
return new StreamObserver<EntityRequest>() {
@Override
public void onNext(EntityRequest request) {
Constant.USER_CONTEXT.get(); // is always null in tests
}
// other methods
};
}
GrpcServiceTest.java
@Test
public void test() {
UserContext mockedContext = ...; // set user context
Context.current().withValue(Constant.USER_CONTEXT, mockedContext)
.run(() -> {
// testing code, call service rpc method
});
}
在没有拦截器的测试中设置上下文的正确方法是什么,以便在 GrpcService
中使用它们的模拟值而没有空值?
问题与使用哪个线程执行无关。 Context.run()
运行s 在当前线程中。并且 RouteGuideServerTest
已经使用 serverBuilder.directExecutor()
在测试线程中获得服务 运行。
问题是服务器有自己的根 Context
用于入站 RPC,与调用时 Context
恰好在当前线程上的任何内容分开。那需要一个拦截器来改变。
我尝试编写单元测试,如 RouteGuideServerTest.java 所示。事实上,我的服务从 Context.Key<UserContext>
中读取一些用户上下文信息(如 userID、ip 等),这些信息设置在某些 UserContextInterceptor
中。
问题是我不想在 JUnit 测试代码中创建拦截器,而是想在测试方法中手动设置上下文,但找不到正确的方法。
我在 Constant.java
中有一些 Context.Key<UserContext> USER_CONTEXT
并尝试以下一种方式设置上下文:
Context.current().withValue(Constant.USER_CONTEXT, userContext).run(() -> { // some testing code })
但是由于 运行 发生在与调用者线程不同的线程中,从 Constant.USER_CONTEXT.get()
返回的上下文在服务代码中始终是 null
。
Constant.java:
public static final Context.Key<UserContext> USER_CONTEXT = Context.key("userContext");
GrpcService.java
@Override
public StreamObserver<EntityRequest> process(StreamObserver<EntityResponse> responseObserver) {
return new StreamObserver<EntityRequest>() {
@Override
public void onNext(EntityRequest request) {
Constant.USER_CONTEXT.get(); // is always null in tests
}
// other methods
};
}
GrpcServiceTest.java
@Test
public void test() {
UserContext mockedContext = ...; // set user context
Context.current().withValue(Constant.USER_CONTEXT, mockedContext)
.run(() -> {
// testing code, call service rpc method
});
}
在没有拦截器的测试中设置上下文的正确方法是什么,以便在 GrpcService
中使用它们的模拟值而没有空值?
问题与使用哪个线程执行无关。 Context.run()
运行s 在当前线程中。并且 RouteGuideServerTest
已经使用 serverBuilder.directExecutor()
在测试线程中获得服务 运行。
问题是服务器有自己的根 Context
用于入站 RPC,与调用时 Context
恰好在当前线程上的任何内容分开。那需要一个拦截器来改变。