Как протестировать API Server Sent Events (написанный на Spring 5 Webflux), когда необходимо выполнить действие для генерации нового события? - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь протестировать мой SSE API способом, описанным в следующем руководстве https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#webtestclient -stream .

К сожалению, у меня это не работает. Для генерации следующего события необходимо выполнить некоторые действия, которые его инициируют. Я не мог сделать это, ожидая ответа от WebTestClient (я не нашел возможности добавить такой обработчик).

Я нашел обходной путь, создав отдельный поток, который периодически генерирует события, но это не так элегантный. Есть ли лучший способ сделать это?

TimerTask task = new TimerTask() {
        public void run() {
                while (true) {
                        //code that trigger generating event periodically
                }
        }
};
Timer timer = new Timer("Timer");
long delay = 1000L;
timer.schedule(task, delay);

FluxExchangeResult<MyEvent> result = client.get().uri("/events")
        .accept(TEXT_EVENT_STREAM)
        .exchange()
        .expectStatus().isOk()
        .returnResult(MyEvent.class); 

Flux<Event> eventFlux = result.getResponseBody();

StepVerifier.create(eventFlux)
        .expectNext(person)
        .expectNextCount(4)
        .consumeNextWith(p -> ...)
        .thenCancel()
        .verify();

1 Ответ

0 голосов
/ 28 апреля 2020

У меня была похожая проблема. Если я вас правильно понимаю, вы хотите опубликовать sh какое-то сообщение, а затем проверить, получаете ли вы это сообщение или нет. Если это так, то вы должны использовать подписку и предоставить потребителю. Вот пример.

FluxExchangeResult<MyEvent> result = client.get().uri("/events")
    .accept(TEXT_EVENT_STREAM)
    .exchange()
    .expectStatus().isOk()
    .returnResult(MyEvent.class)
    .getResponseBody()
    .subscribe(new Consumer<MyEvent>() {
        @Override
        public void accept(String event) {
        }
    });
...