Spring-Webflux: модульный тест функции обработчика вызывает UnsupportedMediaTypeStatusException - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь записать модульный тест в функцию обработчика, я последовал примеру из проекта Spring. Может кто-нибудь помочь мне, почему следующий тест бросает UnsupportedMediaTypeStatusException?

Спасибо

Функция обработчика

public Mono<ServerResponse> handle(ServerRequest serverRequest) {
        log.info("{} Processing create request", serverRequest.exchange().getLogPrefix());

        return ok().body(serverRequest.bodyToMono(Person.class).map(p -> p.toBuilder().id(UUID.randomUUID().toString()).build()), Person.class);
    }

Тестовый класс

@SpringBootTest
@RunWith(SpringRunner.class)
public class MyHandlerTest {

    @Autowired
    private MyHandler myHandler;
    private ServerResponse.Context context;

    @Before
    public void createContext() {
        HandlerStrategies strategies = HandlerStrategies.withDefaults();
        context = new ServerResponse.Context() {
            @Override
            public List<HttpMessageWriter<?>> messageWriters() {
                return strategies.messageWriters();
            }

            @Override
            public List<ViewResolver> viewResolvers() {
                return strategies.viewResolvers();
            }
        };
    }

    @Test
    public void handle() {

        Gson gson = new Gson();

        MockServerWebExchange exchange = MockServerWebExchange.from(
                MockServerHttpRequest.post("/api/create")
                        .body(gson.toJson(Person.builder().firstName("Jon").lastName("Doe").build())));

        MockServerHttpResponse mockResponse = exchange.getResponse();

        ServerRequest serverRequest = ServerRequest.create(exchange, HandlerStrategies.withDefaults().messageReaders());

        Mono<ServerResponse> serverResponseMono = myHandler.handle(serverRequest);

        Mono<Void> voidMono = serverResponseMono.flatMap(response -> {
            assertThat(response.statusCode()).isEqualTo(HttpStatus.OK);
            boolean condition = response instanceof EntityResponse;
            assertThat(condition).isTrue();
            return response.writeTo(exchange, context);
        });

        StepVerifier.create(voidMono)
                .expectComplete().verify();

        StepVerifier.create(mockResponse.getBody())
                .consumeNextWith(a -> System.out.println(a))
                .expectComplete().verify();

        assertThat(mockResponse.getHeaders().getContentType()).isEqualTo(MediaType.APPLICATION_JSON);

    }
}

Сообщение об ошибке: java.lang.AssertionError: ожидание «ожидаемое завершение» не выполнено (ожидаемое: onComplete (); фактическое: onError (org.springframework.web.server.UnsupportedMediaTypeStatusException: 415 UNSUPPORTED_MEDIA_TYPE «Поток типа содержимого») .example.demo.Person "))

1 Ответ

0 голосов
/ 21 июня 2019

Я обнаружил, что пропустил .contentType(MediaType.APPLICATION_JSON) к моему ложному запросу.

MockServerWebExchange.from(
                MockServerHttpRequest.post("/api/create").contentType(MediaType.APPLICATION_JSON)
                        .body(gson.toJson(Person.builder().firstName("Jon").lastName("Doe").build())));

исправил мою проблему.

...