junit 使用JSONPath和Spring MVCAssert数组的数组

nkkqxpd9  于 2023-01-09  发布在  Spring
关注(0)|答案(4)|浏览(126)

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

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

我尝试了这个方法,我可以看到它有rel [0]有self,但是我不希望依赖于self在links数组和rel数组中的位置,而是实际测试在links[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")));
  }
91zkwejq

91zkwejq1#

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

mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
    .andExpect(jsonPath("$.links[0].rel[0]", is("self")))
    .andExpect(jsonPath("$.links[0].href[0]", is("/"));
4smxwvx5

4smxwvx52#

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

MockMvc.perform(get("/"))
.andDo(print()).andExpect(status().isOk())
.andExpect(jsonPath("$.links[*].rel").value(Matchers.containsInAnyOrder(Matchers.containsInAnyOrder(Matchers.is("self")))));
9vw9lbht

9vw9lbht3#

Accepted answer看起来不错,但是我不熟悉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;
import static org.hamcrest.CoreMatchers.is;

希望这对某些人有帮助。尤其是单元测试新手:)

gr8qqesn

gr8qqesn4#

您可以尝试:

mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
    .andExpect(jsonPath("$.links[*].rel[*]", containsInAnyOrder("self")))
    .andExpect(jsonPath("$.links[*].href[*]", containsInAnyOrder("/")))

相关问题