Доступ к WebSession в @WebFluxTest - PullRequest
0 голосов
/ 07 мая 2018

у меня контроллер вот так:

@RestController
public class ApiController {
    @GetMapping(path = "/somethings")
    public Mono<String> getThings(final WebSession webSession) {
        if (!webSession.getAttribute("state").equals("started")) {
            throw new RuntimeException("Cannot make API calls until session has started");
        }

        // Make api calls here...
    }
}

В моем @WebFluxTest мне нужно получить доступ к веб-сеансу, чтобы установить для атрибута «состояние» значение «запущен».

Есть ли способ доступа и обновления WebSession в @WebFluxTest?

1 Ответ

0 голосов
/ 06 ноября 2018

Нашел ответ.

В WebTestClient есть метод mutateWith , в котором вы можете передать WebTestClientConfigurer .

Создав пользовательский WebTestClientConfigurer, можно добавить атрибуты сеанса.

public class SessionMutator implements WebTestClientConfigurer {

    private static Map<String, Object> sessionMap;

    private SessionMutator(final Map<String, Object> sessionMap) {
        this.sessionMap = sessionMap;
    }

    public static SessionMutator sessionMutator(final Map<String, Object> sessionMap) {
        return new SessionMutator(sessionMap);
    }

    @Override
    public void afterConfigurerAdded(final WebTestClient.Builder builder,
                                     final WebHttpHandlerBuilder httpHandlerBuilder,
                                     final ClientHttpConnector connector) {
        final SessionMutatorFilter sessionMutatorFilter = new SessionMutatorFilter();
        httpHandlerBuilder.filters(filters -> filters.add(0, sessionMutatorFilter));
    }

    public static ImmutableMap.Builder<String, Object> sessionBuilder() {
        return new ImmutableMap.Builder<String, Object>();
    }

    private static class SessionMutatorFilter implements WebFilter {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain webFilterChain) {
            return exchange.getSession()
                           .doOnNext(webSession -> webSession.getAttributes().putAll(sessionMap))
                           .then(webFilterChain.filter(exchange));
        }
    }
}

Тогда в @WebFluxTest можно сделать следующее:

webTestClient.mutateWith(sessionMutator(sessionBuilder().put("sessionKey", "sessionValue").build()))
...