【问题标题】:Spring MockMvc verify body is emptySpring MockMvc 验证主体为空
【发布时间】:2018-03-07 07:41:08
【问题描述】:

我有一个简单的 Spring 测试

@Test
public void getAllUsers_AsPublic() throws Exception {
    doGet("/api/users").andExpect(status().isForbidden());
}

public ResultActions doGet(String url) throws Exception {
    return mockMvc.perform(get(url).header(header[0],header[1])).andDo(print());
}

我想验证响应正文是否为空。例如。做类似.andExpect(content().isEmpty())

【问题讨论】:

    标签: spring spring-test spring-test-mvc


    【解决方案1】:

    我认为这些选项之一应该可以实现您所寻找的,虽然不如isEmpty()(来自ContentResultMatchers documentation)那么好:

    .andExpect(content().bytes(new Byte[0])
    

    .andExpect(content().string(""))
    

    【讨论】:

    • 我很惊讶这曾经有效@DaveyDaveDave。我使用 Spring Boot 的 2.2.4.RELEASE 版本(带有来自spring-boot-starter-parent 的托管依赖项)尝试了此操作,但响应没有正文。 Abhijit 的回答有效。您的答案中的字符串方法产生Response content expected:<> but was:<null>。那么如果你使用.string( (String) null),你会得到Response content expected:<null> but was:<null>。啊???您的答案中的字节方法产生Response content expected:<{}> but was:<{110, 117, 108, 108}>(这令人费解,因为 MockHttpServletResponse 记录 Body = null)。
    • 我明白了。 ASCII values 110、117 和 108 分别是“n”、“u”和“l”。您所拥有的是包含文字“null”的响应,而不是空响应。我怀疑.andExpect(content().string("null")) 会通过。
    • 你是正确的@DaveyDaveDave,谢谢。有趣的是我错过了。在这种情况下,jsonPath("$").doesNotExist() 的期望没有失败这一事实是一个问题。
    【解决方案2】:

    有一种更清洁的方法:

    andExpect(jsonPath("$").doesNotExist())
    

    请注意,您不能使用isEmpty,因为它会检查空值,并假定属性存在。当属性不存在时,isEmpty 会抛出异常。而doesNotExist 验证该属性不存在,并且当与$ 一起使用时,它会检查一个空的JSON 文档。

    【讨论】:

    • 一个警告是andExpect(jsonPath("$").doesNotExist()) 将在内容主体存在并包含字符串null(不带引号)时静默成功,这可能是也可能不是您想要的。我在 2.4.0 版本上对此进行了测试。
    • @ChrisH。有趣,但只是一个边缘案例。 null 在 JSON 中得到特殊处理,因此如果所有属性的值都为 null,则可以认为它与空一样好。作为开发人员,我会质疑设计而不是行为;为什么会有人包含null 属性,而不是混淆客户。大多数 JSON 库,例如 Jackson,都可以选择省略写出 null 属性。
    猜你喜欢
    • 2019-08-04
    • 2016-07-30
    • 2019-09-17
    • 1970-01-01
    • 2020-05-29
    • 2020-04-19
    • 1970-01-01
    • 2019-11-02
    • 2018-10-05
    相关资源
    最近更新 更多