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

Schreibe einen Kommentar