Assertion error: No value for JSON Path in JUnit test
Assertion error: No value for JSON Path in JUnit test
我已经写了一个测试,它之前成功了,但现在我得到一个断言错误:JSON 路径没有价值。
@Test
public void testCreate() throws Exception {
Wine wine = new Wine();
wine.setName("Bordeaux");
wine.setCost(BigDecimal.valueOf(10.55));
new Expectations() {
{
wineService.create((WineDTO) any);
result = wine;
}
};
MockMultipartFile jsonFile = new MockMultipartFile("form", "", "application/json", "{\"name\":\"Bordeaux\", \"cost\": \"10.55\"}".getBytes());
this.webClient.perform(MockMvcRequestBuilders.fileUpload("/wine").file(jsonFile))
.andExpect(MockMvcResultMatchers.status().is(200))
.andExpect(MockMvcResultMatchers.jsonPath("$.name").value("Bordeaux"))
.andExpect(MockMvcResultMatchers.jsonPath("$.cost").value(10.55));
}
我得到的错误是:
java.lang.AssertionError: No value for JSON path: $.name, exception: No results path for $['name']
我不明白它没有得到什么或缺少什么。
您断言您的响应包含一个字段 name
,其值为 Bordeaux
。
您可以使用 this.webClient.perform(...).andDo(print())
打印您的回复。
无论您为 .name
测试什么,都不再有一个名为 name
的 属性,关于该部分的错误消息非常清楚。
java.lang.AssertionError: No value for JSON path: $.name, exception: No results path for $['name']
除了您之外,没有人知道您更改了什么以使其从 工作 变为 不工作 您在问题中发布的任何内容都无法说明我们那个
我遇到了同样的问题。
解决方案:
使用.andReturn().getResponse().getContentAsString();
,您的响应将是一个字符串。我的回复是:
{"url":null,"status":200,"data":{"id":1,"contractName":"Test contract"}
当我尝试执行 .andExpect(jsonPath("$.id", is(1)));
时出现错误:java.lang.AssertionError: No value for JSON path: $.id
为了修复它,我做了 .andExpect(jsonPath("$.data.id", is(1)));
并且它起作用了,因为 id 是数据中的一个字段。
很可能 jsonPath 将您的文件主体解释为列表,这应该可以解决问题(注意添加的方括号作为列表访问器):
.andExpect(MockMvcResultMatchers.jsonPath("$[0].name").value("Bordeaux"))
.andExpect(MockMvcResultMatchers.jsonPath("$[0].cost").value(10.55));
我在将 jackson-dataformat-xml
依赖项添加到我的项目后遇到了同样的问题。
为了解决这个问题,我不得不更改我的响应实体:
return new ResponseEntity<>(body, HttpStatus.*STATUS*)
到
return ResponseEntity.*status*().contentType(MediaType.APPLICATION_JSON).body(*your body*)
.
这样就可以正常工作了,因为您已经直接将 json
设置为 return 类型 body。
我的 return body 是 {'status': 'FINISHED', 'active':false}
并且 jsonPath 确实看到了 status
字段,但看到了 active
。
解决方案:使用 jsonPath("$.['status']")
而不是 jsonPath("$.status")
我的假设:可能 jsonPath 忽略了一些关键字,如 'status' 等....
我已经写了一个测试,它之前成功了,但现在我得到一个断言错误:JSON 路径没有价值。
@Test
public void testCreate() throws Exception {
Wine wine = new Wine();
wine.setName("Bordeaux");
wine.setCost(BigDecimal.valueOf(10.55));
new Expectations() {
{
wineService.create((WineDTO) any);
result = wine;
}
};
MockMultipartFile jsonFile = new MockMultipartFile("form", "", "application/json", "{\"name\":\"Bordeaux\", \"cost\": \"10.55\"}".getBytes());
this.webClient.perform(MockMvcRequestBuilders.fileUpload("/wine").file(jsonFile))
.andExpect(MockMvcResultMatchers.status().is(200))
.andExpect(MockMvcResultMatchers.jsonPath("$.name").value("Bordeaux"))
.andExpect(MockMvcResultMatchers.jsonPath("$.cost").value(10.55));
}
我得到的错误是:
java.lang.AssertionError: No value for JSON path: $.name, exception: No results path for $['name']
我不明白它没有得到什么或缺少什么。
您断言您的响应包含一个字段 name
,其值为 Bordeaux
。
您可以使用 this.webClient.perform(...).andDo(print())
打印您的回复。
无论您为 .name
测试什么,都不再有一个名为 name
的 属性,关于该部分的错误消息非常清楚。
java.lang.AssertionError: No value for JSON path: $.name, exception: No results path for $['name']
除了您之外,没有人知道您更改了什么以使其从 工作 变为 不工作 您在问题中发布的任何内容都无法说明我们那个
我遇到了同样的问题。
解决方案:
使用.andReturn().getResponse().getContentAsString();
,您的响应将是一个字符串。我的回复是:
{"url":null,"status":200,"data":{"id":1,"contractName":"Test contract"}
当我尝试执行 .andExpect(jsonPath("$.id", is(1)));
时出现错误:java.lang.AssertionError: No value for JSON path: $.id
为了修复它,我做了 .andExpect(jsonPath("$.data.id", is(1)));
并且它起作用了,因为 id 是数据中的一个字段。
很可能 jsonPath 将您的文件主体解释为列表,这应该可以解决问题(注意添加的方括号作为列表访问器):
.andExpect(MockMvcResultMatchers.jsonPath("$[0].name").value("Bordeaux"))
.andExpect(MockMvcResultMatchers.jsonPath("$[0].cost").value(10.55));
我在将 jackson-dataformat-xml
依赖项添加到我的项目后遇到了同样的问题。
为了解决这个问题,我不得不更改我的响应实体:
return new ResponseEntity<>(body, HttpStatus.*STATUS*)
到
return ResponseEntity.*status*().contentType(MediaType.APPLICATION_JSON).body(*your body*)
.
这样就可以正常工作了,因为您已经直接将 json
设置为 return 类型 body。
我的 return body 是 {'status': 'FINISHED', 'active':false}
并且 jsonPath 确实看到了 status
字段,但看到了 active
。
解决方案:使用 jsonPath("$.['status']")
而不是 jsonPath("$.status")
我的假设:可能 jsonPath 忽略了一些关键字,如 'status' 等....