24

spring mvc の JSON ドキュメント応答で jsonPath を使用してアサートする方法がわかりません。おそらく、この特定のシナリオで jsonPath を使用するよりも、これを達成するためのより良い方法があります。リンク配列に「self」の rel 項目があり、「self」のオブジェクトの「href」属性にも「/」に等しい「href」属性があることを検証したいと思います。JSON 応答は次のようになります。

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

rel [0]にselfがあることがわかる場所でこれを試しましたが、links配列とrel配列のどこにselfがあるかに依存せず、そのhrefがlinks[rel] [self]にあるものを実際にテストしたいと思いますは "/"。何か案は?

 @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

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 に答える