Spring Boot测试 - 尽管有内容,但MockHttpServletResponse getContentLength返回0

问题描述 投票:2回答:1

我注意到在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);

为什么这样实现?

java httpresponse servlet-3.0 spring-boot-test
1个回答
0
投票

可能是这种情况,在类中执行的值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的实现

© www.soinside.com 2019 - 2024. All rights reserved.