gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:40:42 25 4
gpt4 key购买 nike

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

我有一些Context.Key<UserContext> USER_CONTEXTConstant.java并尝试以下一种方式设置上下文:

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() 在当前线程中运行。并且 RouteGuideServerTest 已经使用 serverBuilder.directExecutor() 让服务在测试线程中运行。

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

关于java - 如何在没有自定义拦截器的测试中设置上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56018510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com