Как установить контекст в тестах без пользовательских перехватчиков - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь написать модульные тесты, как показано в 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 без нулей?

1 Ответ

0 голосов
/ 07 мая 2019

Проблема не связана с тем, какой поток используется для выполнения.Context.run() работает в текущем потоке.И RouteGuideServerTest уже использует serverBuilder.directExecutor() для запуска службы в тестовом потоке.

Проблема в том, что у сервера есть собственный корень Context, который он использует для входящих RPC, отдельно от любых Contextбывает в текущем потоке при вызове.Для этого требуется перехватчик.

...