使用Hamcrest与jsonPath断言JSON时遇Expected: null but: was <[null]>问题
解决MockMvc jsonPath断言null时出现"Expected: null but: was <[null]>"的问题
我来帮你搞定这个问题!你遇到的报错核心原因在于jsonPath表达式的写法不对,导致返回的结果是一个数组而非单个值。
问题分析
你用的jsonPath("*.errorMessage")表达式里,*是通配符,会匹配JSON中所有层级下的errorMessage字段——哪怕只有一个匹配项,它返回的也是一个数组(也就是你看到的<[null]>)。而你用IsNull.nullValue()断言的是单个null值,自然就不匹配了。
再看你的返回JSON结构:
{ "some_string": { "errorMessage": null } }
这里的errorMessage是明确嵌套在some_string下的,完全可以精准定位,不需要用通配符。
解决方案
把jsonPath表达式改成精准路径即可,用$.some_string.errorMessage来定位到单个errorMessage字段:
mockMvc.perform(post(TEST_ENDPOINT) .param("someParam", SOMEPARAM)) .andDo(print()) .andExpect(status().is2xxSuccessful()) .andExpect(jsonPath("$.some_string.errorMessage").value(IsNull.nullValue()));
这样修改后,jsonPath会返回单个的null值,和你期望的IsNull.nullValue()完全匹配,断言就能成功通过了。
如果之后遇到需要匹配多个errorMessage的场景(比如数组中的多个对象),可以用everyItem来断言数组里的每个元素都是null:
.andExpect(jsonPath("*.errorMessage").everyItem(IsNull.nullValue()))
不过你的场景里用第一种精准路径的方案就足够啦。
内容的提问来源于stack exchange,提问作者Bartek
相关产品推荐
相关产品推荐

