Spring Boot test - MockHttpServletResponse getContentLength возвращает 0, несмотря на содержание - PullRequest
0 голосов
/ 24 августа 2018

Я заметил, что при тестировании Spring Boot getContentLength() из MockHttpServletResponse, так же как и javax.servlet.http.HttpServletResponse, читает только заголовок запроса "Content-Length", чтобы определить возвращаемое значение, но если в моем тесте я не установил заголовок возвращает 0, игнорируя, есть ли контент.

@Then("xxxxx returns {string} and status code {int}")
public void xxxxx_returns_and_status_code(String result, Integer code) throws Exception {
    assertThat(this.results.getResponse().getContentType()).isEqualTo(MediaType.APPLICATION_JSON_UTF8_VALUE); // <-- pass
    assertThat(this.results.getResponse().getStatus()).isEqualTo(code); // <-- pass

    System.out.println(this.results.getResponse().getContentLength()); // 0???
    System.out.println(this.results.getResponse().getContentAsString()); // the correct response

    assertThat(this.results.getResponse().getContentLength()).isNotEqualTo(0); // not pass, confusing
    getContentAsString()// pass
}

Это стандартно, но как-то сбивает с толку.

Чтобы пройти тест, я должен сделать:

assertThat(this.results.getResponse().getContentAsString().length()).isNotEqualTo(0);

Почему это было реализовано таким образом?

1 Ответ

0 голосов
/ 24 августа 2018

МОЖЕТ быть случай, когда преобразование целых чисел значения HttpHeaders.CONTENT_LENGTH, которое выполняется в классе, приводит к такому поведению.Это код, устанавливающий значение для contentLength (которое инициируется и сбрасывается в 0):

else if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) {
            setContentLength(value instanceof Number ? ((Number) value).intValue() :
                    Integer.parseInt(value.toString()));
            return true;
}

Может быть, getContentLengthLong поможет вашей проблеме?

Проверьте реализацию на: https://github.com/spring-projects/spring-framework/blob/master/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java

...