24

我很难弄清楚如何在 spring mvc 的 JSON 文档响应中使用 jsonPath 进行断言。也许有比在这个特定场景中使用 jsonPath 更好的方法来实现这一点。我想验证链接数组有一个“self”的rel项,并且“self”对象的“href”属性也有一个等于“/”的“href”属性。JSON 响应如下所示:

 {  
   "links":[  
      {  
         "rel":[  
            "self"
         ],
         "href":"/"
      },
      {  
         "rel":[  
            "next"
         ],
         "href":"/1"
      }
   ]
}

我试过这个,我可以看到它有 rel [0] 有 self 但我宁愿不依赖链接数组和 rel 数组中 self 的位置,并实际测试链接 [rel][self] 的 href 是什么是 ”/”。有任何想法吗?

 @Before
  public void setup() {
    MockitoAnnotations.initMocks(this);
    mockMvc = MockMvcBuilders.standaloneSetup(welcomeController).build();
  }

  @Test
  public void givenRootUrl_thenReturnLinkToSelf() throws Exception {
    mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
        .andExpect(jsonPath("$.links[0].rel[0].", is("self")));
  }
4

3 回答 3

31

添加几个andExpect方法怎么样?类似于:

mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
    .andExpect(jsonPath("$.links[0].rel[0]", is("self")))
    .andExpect(jsonPath("$.links[0].href[0]", is("/"));
于 2015-04-14T10:27:42.707 回答
6

如果您不想硬编码数组索引值,我想您可以这样做

MockMvc.perform(get("/"))
.andDo(print()).andExpect(status().isOk())
.andExpect(jsonPath("$.links[*].rel").value(Matchers.containsInAnyOrder(Matchers.containsInAnyOrder(Matchers.is("self")))));
于 2020-12-13T04:28:41.923 回答
5

接受的答案对我来说没问题。但是我对junit4不熟悉。因此,我将在此处添加如何使用 Junit5 测试典型场景。

mockMvc.perform(get("/"))
    .andDo(print())
    .andExpect(status().isOk())
    .andExpect(jsonPath("$.links", hasSize(2)))
    .andExpect(jsonPath("$.links[0].rel[0]")
        .value("self"))
    .andExpect(jsonPath("$.links[0].href[0]")
        .value("/"))

我将在这里添加静态导入(如果是初学者),因为当我第一次工作时,我必须确定几个导入中的哪些导入。

import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import static org.hamcrest.Matchers.hasSize;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

希望这对某人有帮助。特别是单元测试的新手:)

于 2019-01-16T05:29:14.653 回答