Как сделать WebFluxTest с ReactiveSecurityContexHolder - PullRequest
0 голосов
/ 17 января 2020

Вот простой класс, читающий основного пользователя из контекста безопасности пружины:

public Mono<Void> getAndCheckAccessRights(Integer agencyKey) {
    return ReactiveSecurityContextHolder.getContext()
            .map(securityContext -> getAccessRights(agencyKey, securityContext.getAuthentication().getName()))
            .switchIfEmpty(Mono.defer(() -> {
                log.error("No security context found!");
                throw new AuthorizationException("No security context found!");
            }))
            .flatMap(accessRightsDtoMono -> checkAccessRights(accessRightsDtoMono))
            .then();
}

private Mono<AccessRightsDto> getAccessRights(Integer agencyKey, String bensl) {
    return dataServiceWebClient.get()
            .uri("/access_rights/" + agencyKey + "/" + bensl)
            .retrieve()
            .bodyToMono(AccessRightsDto.class)
            .switchIfEmpty(Mono.defer(() -> {
                log.error("No user found!");
                throw new AuthorizationException("No user found!");
            }));
}

Пока тестирование не соответствует тому, что предполагается, выполнение просто перепрыгивает строки кода без выполнения потоков методов. map или .flatMap, Журналы не распечатываются, и на любом уровне не ведется ведение журнала отладки, тест просто запускается, так как все завершается правильно, я не имею ни малейшего понятия о том, почему это происходит:

@WebFluxTest(AccessRightService.class)
...
@Test
@WithMockUser
void getAndCheckAccessRights_NOT_AUTHORIZED() throws JsonProcessingException {
    AccessRightsDto testAccessRightsDto = AccessRightsDto
            .builder(123456789, "test", "test", PUBLISH, PUBLISH, PUBLISH, PUBLISH, PUBLISH,
                    PUBLISH, PUBLISH, PUBLISH, NO_ACCESS)
            .build();
    MockResponse response = new MockResponse();
    response.setResponseCode(HttpStatus.OK.value()).setBody(objectMapper.writeValueAsString(testAccessRightsDto));
    mockWebServer.enqueue(response);
    assertThrows(AuthorizationException.class, () -> accessRightService.getAndCheckAccessRights(123456789));
}

Конечно, когда при запуске приложения оно работает правильно, как и ожидалось, тестирование странное!

Приложение работает с весенней загрузкой 2.2.2 и okhttp3 mockwebserver.

1 Ответ

0 голосов
/ 23 января 2020

Мое плохое, я забыл поставить .block() после getAndCheckAccessRights, который распространяет информацию о вводе объекта, без того, чтобы ничего не произошло.

На самом деле не очень понятно, как это работает в случае Netty, потому что он не принимает .block(), но на тестах нормально называть его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...