【问题标题】:Spring Boot test - MockHttpServletResponse getContentLength return 0 despite of contentSpring Boot 测试 - MockHttpServletResponse getContentLength 返回 0,尽管有内容
【发布时间】:2018-08-24 12:57:09
【问题描述】:

我注意到在Spring Boot测试中,MockHttpServletResponsegetContentLength(),和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】:

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

    【讨论】:

    • 不,它仍然返回 0。实际上 long 方法只返回 contentLength 并且 getContentLength() 返回与 long 相同的值。所以它们是一样的。
    • 你调试过库了吗?代码可以在发布的链接下找到。
    • 我没有调试到库中,因为我在运行.feature 文件时无法调试,这是真的吗?我试图对long 值进行sysout,但什么也没有。还是 0。
    • 你好@fl0w,现在我只是尝试调试到库中,发现上面那行永远达不到,因为我没有设置Content-Length标题,它永远不会进入这个@987654329 @。我还在setContentLength()setContentLengthLong() 上设置断点,但它也从未到达那里。我认为这里缺少一些逻辑;或者,如果我理解得很好,这种方法非常字面:读取标头并返回值,而不是返回实际值。
    • @WesternGun jup,那是绝对有道理的,如果从未调用过设置器,那么该值将不可用:) - 祝贺您的分析。我会对你的解决方案感兴趣:)
    猜你喜欢
    • 2020-10-07
    • 2015-04-15
    • 1970-01-01
    • 2021-11-03
    • 2016-03-20
    • 2023-03-08
    • 1970-01-01
    • 2021-10-19
    • 2016-10-20
    相关资源
    最近更新 更多