Assertion error: No value for JSON Path in JUnit test
Solution 1
You are asserting that your response contains a field name
with value Bordeaux
.
You can print your response using this.webClient.perform(...).andDo(print())
.
Solution 2
I was getting same problem.
Solution :
Use .andReturn().getResponse().getContentAsString();
, your response will be a string. My response was:
{"url":null,"status":200,"data":{"id":1,"contractName":"Test contract"}
When I was trying to do .andExpect(jsonPath("$.id", is(1)));
there was an error: java.lang.AssertionError: No value for JSON path: $.id
To fix it, I did .andExpect(jsonPath("$.data.id", is(1)));
and it works because id is a field in data.
Solution 3
Most likely jsonPath interprets the body of your file as a list and this should do the trick (mind the added square brackets as list accessors):
.andExpect(MockMvcResultMatchers.jsonPath("$[0].name").value("Bordeaux"))
.andExpect(MockMvcResultMatchers.jsonPath("$[0].cost").value(10.55));
Solution 4
My return body was {'status': 'FINISHED', 'active':false}
and jsonPath did see status
field, but saw active
.
The solution: use jsonPath("$.['status']")
instead of jsonPath("$.status")
My assumption: Probably jsonPath ignores some keywords like 'status', etc....
Robin van Aalst
Updated on November 25, 2021Comments
-
Robin van Aalst over 2 years
I have written a test and it succeeded before but now I get an AssertionError: No value for JSON Path.
@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)); }
The error I get is:
java.lang.AssertionError: No value for JSON path: $.name, exception: No results path for $['name']
I don't understand what it is not getting or what is missing.