bugfix> unit-testing > 投稿

StringとArrayの組み合わせを持つ以下のJSONのmockMVCテストの書き方。

{
  "id":1,
  "firstName":"NPA",
  "lastName":"TAS",
  "mobile":"123454321",
  "email":"ABCD@GMAIL.COM",
  "accounts":[
         {
          "id":1,
          "balance":"$1000",
          "custid":"1",
          "accNbr":"12345"
         }
            ]
}

私のコード:

@Test
        public void testJson() throws Exception {
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
            mockMvc.perform(get("/acc/1")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.accounts.id", Matchers.is(1)))
            .andExpect(jsonPath("$.accounts.balance", Matchers.is("$1000")))
            .andExpect(jsonPath("$.accounts.accNbr", Matchers.is("12345")))
            .andExpect(jsonPath("$.accounts.custid", Matchers.is("1")))
            .andExpect(jsonPath("$.*", Matchers.hasSize(4)));
        }

例外が発生します

JSONパス「$.accounts.id」に値がありません、例外:

Expected to find an object with property ['accounts'] in path $ but found 'net.minidev.json.JSONArray'. This is not a json object according to the JsonProvider: 'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'.

ただし、$。accounts [0] .idを使用しようとすると、例外が発生します

JSONパス "$.accounts [0] .id"に値がありません、例外:

Expected to find an object with property ['accounts'] in path $ but found 'net.minidev.json.JSONArray'. This is not a json object according to the JsonProvider: 'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'.

回答 2 件
  • ザ・ accounts  属性は配列なので、これは $.accounts.id  次のようなインデクサーを使用する必要があります: $.accounts[0].id

    ドキュメントから:

    [<number> (, <number>)]     Array index or indexes
    
    

    使用するインデックスが不明な場合は、JSONをフィルター処理し、フィルター処理されたアカウントサブ文書でアサートできます。例えば:

    $.accounts[?(@.id == 1)].balance$1000 を返します

    $.accounts[?(@.accNbr == 12345)].id1 を返します

    ...など

    ドキュメントで詳細を確認してください。JsonPathエバリュエーターを使用して、これを試すことができます。

  • @glytchingと私が述べたように、配列があり、それは $.accounts[0].id で動作するはずです 。

    それでも問題が発生する場合は、コンソールに結果を出力してみます。

    MvcResult result = mockMvc.perform(MockMvcRequestBuilders
             .get("/acc/1").accept(MediaType.APPLICATION_JSON)).andReturn();
    String content = result.getResponse().getContentAsString();
    
    

あなたの答え