tester read playground java spring testing jsonpath spring-test-mvc

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

hasSize (int) javadoc


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]