Как десериализовать тело ClientResponse в тестовой среде Spring? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь создать ClientResponse в тесте и использовать его для тестирования сервиса, который также выполняет десериализацию стандартным способом response.bodyToMono(..class..). Но, похоже, что-то не так в том, как я создаю фальшивый ответ клиента. Потому что я получаю UnsupportedMediaTypeException в тестах.

Тем не менее тот же самый код прекрасно работает во время выполнения приложения SpringBoot, когда WebClient возвращает ClientResponse (который встроен внутри).

Давайте посмотрим на простейший случай, который завершается с

org.springframework.web.reactive.function.UnsupportedMediaTypeException:
             Content type 'application/json' not supported for bodyType=java.lang.String[]

 void test()
 {
   String body = "[\"a\", \"b\"]";
   ClientResponse response = ClientResponse.create(HttpStatus.OK)
                                           .header(HttpHeaders.CONTENT_TYPE, 
                                                   MediaType.APPLICATION_JSON_VALUE)
                                           .body(body)
                                           .build();

   String[] array = response.bodyToMono(String[].class).block();

   assertEquals(2, array.length);
}

Пожалуйста, помогите мне понять, как должен формироваться ответ клиента, чтобы обеспечить стандартную (json -> объект) десериализацию в тестовой среде.

1 Ответ

0 голосов
/ 25 марта 2020

A ClientResponse, созданный вручную, не имеет доступа к Jackson2Json стратегиям обмена в списке по умолчанию. Возможно, его можно настроить с помощью автоматической конфигурации Spring, которая отключена в тестах без контекста Spring.

Вот простой способ принудительно (де) сериализации String <-> json:

static ExchangeStrategies jacksonStrategies()
{
    return ExchangeStrategies
            .builder()
            .codecs(clientDefaultCodecsConfigurer ->
            {
                clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(new ObjectMapper(), MediaType.APPLICATION_JSON));
                clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(new ObjectMapper(), MediaType.APPLICATION_JSON));

            }).build();
}

Затем используйте его в функции create

ClientResponse.create(HttpStatus.OK, jacksonStrategies())...
...