Я пытаюсь написать модульные тесты, как показано в RouteGuideServerTest.java .Дело в том, что мой сервис считывает некоторую информацию о контексте пользователя (например, userID, ip и т. Д.) Из Context.Key<UserContext>
, который установлен в некотором UserContextInterceptor
.Проблема в том, что я не хочу создавать тот же перехватчик в тестовом коде JUnit и хочу установить контекст вручную прямо в тестовом методе, но не могу найти способ сделать это правильно.
У меня есть Context.Key<UserContext> USER_CONTEXT
в Constant.java
и попытался установить Context следующим образом:
Context.current().withValue(Constant.USER_CONTEXT, userContext).run(() -> { // some testing code })
, но, поскольку run происходит в другом потоке из потока вызывающего, контекст, возвращаемый из 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
без нулей?