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' 等....