playground - jsonpath read java
contar miembros con jsonpath? (3)
¿Es posible contar la cantidad de miembros que usan JsonPath?
Usando spring mvc test estoy probando un controlador que genera
{"foo": "oof", "bar": "rab"}
con
standaloneSetup(new FooController(fooService)).build()
.perform(get("/something").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
.andExpect(jsonPath("$.foo").value("oof"))
.andExpect(jsonPath("$.bar").value("rab"));
Me gustaría asegurarme de que no haya otros miembros presentes en el JSON generado. Con suerte al contarlos usando jsonPath. ¿Es posible? Las soluciones alternativas también son bienvenidas.
He estado lidiando con esto yo mismo hoy. No parece que esto se implemente en las aserciones disponibles. Sin embargo, hay un método para pasar un objeto org.hamcrest.Matcher
. Con eso puedes hacer algo como lo siguiente:
final int count = 4; // expected count
jsonPath("$").value(new BaseMatcher() {
@Override
public boolean matches(Object obj) {
return obj instanceof JSONObject && ((JSONObject) obj).size() == count;
}
@Override
public void describeTo(Description description) {
// nothing for now
}
})
Para probar el tamaño de la matriz : jsonPath("$", hasSize(4))
Para contar miembros del objeto : jsonPath("$.*", hasSize(4))
Es decir, para probar que API devuelve una matriz de 4 elementos:
valor aceptado: [1,2,3,4]
mockMvc.perform(get(API_URL))
.andExpect(jsonPath("$", hasSize(4)));
para probar que API devuelve un objeto que contiene 2 miembros:
valor aceptado: {"foo": "oof", "bar": "rab"}
mockMvc.perform(get(API_URL))
.andExpect(jsonPath("$.*", hasSize(2)));
Estoy usando Hamcrest versión 1.3 y Spring Test 3.2.5.RELEASE
si no tiene com.jayway.jsonassert.JsonAssert
en su classpath (que fue el caso conmigo), las pruebas de la siguiente manera pueden ser una posible solución alternativa:
assertEquals(expectedLength, ((net.minidev.json.JSONArray)parsedContent.read("$")).size());
[nota: supuse que el contenido de la json es siempre una matriz]