2016-10-20 49 views
0

請假設以下響應如何縮短用於標識數組中單個元素的json路徑?

{ 
    "animals": [ 
    { 
     "name": "hobba", 
     "embeddedData": { 
     "age": "3", 
     "color": "white" 
     } 
    }, 
    { 
     "name": "obba", 
     "embeddedData": { 
     "age": "1", 
     "color": "yellow" 
     } 
    } 
    ] 
} 

我需要斷言與特定值的數組中的元素的存在。這就是我要做的事:

JsonPath jsonPath = response.jsonPath(); 
Assert.assertNotNull("Error message", jsonPath .param("name", "hobba").param("age", "3").param("color", "white").get("animals.find { a -> a.name == name && a.embeddedData.age == age && a.embeddedData.color == color")); 

正如你看到的,我的每一個元素,我需要斷言它的值之前,鍵入a.embeddedData。這只是一個例子,因爲將會有許多要素來維護自己的價值觀。

是否有一個更可讀和循環友好的方式來做到這一點? 另外如果embeddedDataanimals中有一個數組,我該如何仍然執行斷言與animals中的每個元素?

回答

1

您可以使用內置的斷言功能與匹配器檢查身體:

.then() 
    .assertThat() 
    .root("animals.embeddedData") 
    .body("age", Every.everyItem(Matchers.notNullValue())) 
    .body("color", Every.everyItem(Matchers.notNullValue()))  
+0

但是,這並不爲'age'&'color'每個'animal'元素斷言值加在一起。我的意思是我需要確保有一個元素'age == 3 && color == white'。這是一個單一的元素。您的代碼爲每個元素單獨聲明「age」的值,然後爲每個元素單獨聲明「color」。 –

+0

只需用'animals [0] .embeddedData'和'everyItem'替換'animalss.embeddedData'與所需的匹配器 – RocketRaccoon

+0

將上一條評論中的信息與'response.jsonPath()。getList(「animals」)。size() ;'解決了我的情況。謝謝。 –

相關問題