Check Map key/values with jsonPath

14,829

If you're using hamcrest Matchers that's pretty easy. There are two methods to get your hands on either key or value of the map entry.

  • Matchers.hasKey()

  • Matchers.hasValue()

And a simple example to check if all keys are present in the resulting Map. $.translationProperties directly points to the map.

 ResultActions resultActions = mvc.perform(...);
 List<String> languagesToBePresent = new ArrayList<>(); //add some values here

 for (String language : languagesToBePresent) {
            resultActions.andExpect(
                  jsonPath("$.translationProperties", Matchers.hasKey(language)));
        }
Share:
14,829
xedo
Author by

xedo

Updated on July 29, 2022

Comments

  • xedo
    xedo over 1 year

    I'm testing a controller that returns a Map

    @RequestMapping("/")
    @ResponseBody
    public Map<String, String> getMessages(@RequestBody String foo) {
        Map<String, String> map = boo.getMap(foo);
        return map;
    }
    

    Test:

    ...
    resultActions
            .andDo(print())
            .andExpect(status().isOk())
            .andExpect(
                    content().contentTypeCompatibleWith(
                            MediaType.APPLICATION_JSON))
            .andExpect(jsonPath("$", notNullValue()))
            .andExpect(jsonPath(EXPRESSION, equalsTo(foo));
     ...
    

    Which expression should I use to read the key and the value from the Map?

    Edit: A way around to solve it could be:

    MvcResult result = resultActions.andReturn();
    MockHttpServletResponse response = result.getResponse();
    String content = response.getContentAsString();
    Gson gson = new Gson();
    Type typeOfT = new TypeToken<Map>() {
    }.getType();
    Map<String, String> map = gson.fromJson(content, typeOfT);
    

    And then loop through the map checking the values. But is there a way to do it with jsonPath?