Hamcrest mit MockMvc: überprüfen Sie, ob der Schlüssel existiert, aber der Wert kann null sein
Ich mache einige tests mit MockMvc, und ich möchte überprüfen die Struktur eines JSON-Antwort. Insbesondere möchte ich sicherstellen, dass der Schlüssel für ein Attribut vorhanden ist, und dass der Wert eines bestimmten Typs oder null.
{
"keyToNull": null, # This may be null, or a String
"keyToString": "some value"
}
Folgende Werke für mich, aber ich Frage mich, ob es einen Weg gibt, zu kombinieren, jede Gruppe von zwei Erwartungen in einer einzigen Zeile, da habe ich eine Menge von Attributen zu überprüfen:
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.hamcrest.Matchers.*;
.andExpect(jsonPath("$").value(hasKey("keyToNull")))
.andExpect(jsonPath("$.keyToNull").value(
anyOf(any(String.class), nullValue(String.class))))
.andExpect(jsonPath("$").value(hasKey("keyToString")))
.andExpect(jsonPath("$.keyToString").value(
anyOf(any(String.class), nullValue(String.class))))
Den hasKey()
ist notwendig, weil die andere Behauptung, die von selbst vergeht seit dem nicht vorhandenen Schlüssel in MockMvc Implementierung Karte, um null:
.andExpect(jsonPath("$.notAKey").value(
anyOf(any(String.class), nullValue(String.class)))) //ok
jsonPath().exists()
auch nicht funktionieren, weil es intern vergleicht der Wert gegen null
.
Habe ich überlegt, eine separate Methode wie diese:
private static <T> void assertNullableAttr(ResultActions res, String jsonPath, Class<T> type) throws Exception {
int split = jsonPath.lastIndexOf('.');
String prefix = jsonPath.substring(0, split), key = jsonPath.substring(split+1);
res.andExpect(jsonPath(prefix).value(hasKey(key)))
.andExpect(jsonPath(jsonPath).value(anyOf(any(type), nullValue(type))));
}
Aber dann ist es zwingt mich zum split mein code in einer unnatürlichen Weise:
ResultActions res = mockMvc.perform(get("/api"))
//these attributes must not be null
.andExpect(jsonPath("$.someInfo").value(hasSize(2)))
.andExpect(jsonPath("$.someInfo[0].info1").value(any(String.class)))
.andExpect(jsonPath("$.someInfo[0].info2").value(any(String.class)))
.andExpect(jsonPath("$.addlInfo").value(hasSize(2)))
.andExpect(jsonPath("$.addlInfo[0].info1").value(any(String.class)))
.andExpect(jsonPath("$.addlInfo[0].info2").value(any(String.class)));
//these attributes may be null
assertNullableAttr(res, "$.someInfo[0].info3", String.class);
assertNullableAttr(res, "$.someInfo[0].info4", String.class);
assertNullableAttr(res, "$.addlInfo[0].info3", String.class);
assertNullableAttr(res, "$.addlInfo[0].info4", String.class);
Ist es clever Hamcrest Matcher, die ich anwenden könnte, um ein einzelnes json-Pfad-pro-Attribut?
InformationsquelleAutor nebulabrot | 2014-08-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die folgenden statischen matcher Fabrik:
Und dann, Sie können es verwenden, wie diese:
InformationsquelleAutor Yonatan
Können Sie führen diesen Vorgang mit den folgenden vorhandenen test-Klassen:
Werden Sie sicher, dass der import org.hamcrest.core.IsNull
InformationsquelleAutor Jeremy D
Ich fand diese Lösung in diesem blog:
Es funktioniert für mich.
InformationsquelleAutor nacho