Saya mencoba membuat ClientResponse dalam pengujian dan menggunakannya untuk menguji layanan, yang juga melakukan deserialisasi dengan cara standar response.bodyToMono(..class..). Tetapi tampaknya ada yang salah dalam cara saya membangun respons klien palsu. Karena saya menerima UnsupportedMediaTypeException dalam pengujian.

Namun demikian kode yang sama berfungsi dengan baik di aplikasi SpringBoot runtime, ketika WebClient mengembalikan ClientResponse (yang dibangun secara internal).

Mari kita lihat kasus paling sederhana yang gagal dengan

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);
}

Tolong, bantu saya untuk memahami, bagaimana respons klien harus dibangun untuk memungkinkan deserialisasi standar (json -> objek) di lingkungan pengujian.

0
diziaq 24 Maret 2020, 15:20

1 menjawab

Jawaban Terbaik

ClientResponse yang dibuat secara manual tidak memiliki akses ke Jackson2Json strategi pertukaran dalam daftar default. Mungkin itu bisa dikonfigurasi dengan konfigurasi otomatis Spring, yang dimatikan dalam pengujian tanpa konteks Spring.

Berikut adalah cara langsung untuk memaksa (de)serialisasi 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();
}

Kemudian gunakan dalam fungsi create

ClientResponse.create(HttpStatus.OK, jacksonStrategies())...
0
diziaq 25 Maret 2020, 18:57