Веб-клиент Spring висит на bodyToMono (Pojo) с помощью MockServer - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу смоделировать внешний API, который я называю частью моего сервиса.Поэтому я хотел использовать MockWebServer от okhttp3.Моя проблема в том, что вызов bodyToMono работает нормально, если я хочу получить тело в виде строки, но не работает при извлечении его в качестве класса данных.Я попытался обрезать его, используя следующий фрагмент кода:

public class MockWebClientTest {

    private MockWebServer server;

    @BeforeEach
    public void setUp() throws IOException {
        server = new MockWebServer();
        server.start(9876);
    }

    @AfterEach
    public void tearDown() throws IOException {
        server.shutdown();
    }

    @Test
    public void stringWorks() throws JsonProcessingException {
        createMockedTokenCall();

        Mono<String> response = WebClient.create(this.server.url("/").toString())
            .get()
            .uri("/")
            .retrieve()
            .bodyToMono(String.class);

        System.out.println(response.block());
    }

    @Test
    public void classDoesNotWork() {
        createMockedTokenCall();

        Mono<AuthToken> response = WebClient.create(this.server.url("/").toString())
            .get()
            .uri("/")
            .retrieve()
            .bodyToMono(AuthToken.class);

        System.out.println(response.block());
    }

    private void createMockedTokenCall() {
        server.enqueue(new MockResponse().setBody("{\"accessToken\":\"BARBAR\",\"refreshToken\":\"FOOFOO\"}"));
    }
}

class AuthToken {
    private String accessToken;
    private String refreshToken;

    //constructor
}

Первый тест (stringWorks) работает нормально и возвращает правильное представление json.Однако второй тест (classDoesNotWork) навсегда зависает при вызове bodyToMono.

Я предполагаю, что это не имеет никакого отношения к библиотеке okttp3 напрямую, поскольку у меня была та же ошибка при использовании Wiremock.Однако тот же код работает при нацеливании на конечную точку реального API.К сожалению, я не смог найти другой способ проверить свои звонки, используя WebClient, так как Spring в настоящее время не поддерживает его напрямую (см. SPR-15286 ).

Я действительно с нетерпением ждучтобы помочь в этом вопросе!Заранее спасибо!

Общее замечание: По сути, это более или менее копия контрольного примера shouldReceiveJsonAsPojo в https://github.com/spring-projects/spring-framework/blob/master/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java

1 Ответ

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

Хорошо, после просмотра связанного теста и небольшого сравнения я нашел решение (или, так сказать, мою ошибку): я забыл правильный заголовок Content-Type. Так что работает, используя следующее:

private void createMockedTokenCall() {
    server.enqueue(new MockResponse().setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE).setBody("{\"accessToken\":\"BARBAR\",\"refreshToken\":\"FOOFOO\"}"));
}

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

...