How to test if JSON path does not include a specific element, or if the element is present it is null?

前端 未结 5 1307
野趣味
野趣味 2021-02-04 23:17

I have been writing some simple unit testing routines for a simple spring web application. When I add @JsonIgnore annotation on a getter method of a resource, the resulting json

5条回答
  •  生来不讨喜
    2021-02-04 23:42

    @JsonIgnore is behaving as expected, not producing the password in the json output, so how could you expect to test something that you are explicitly excluding from the output?

    The line:

    .andExpect(jsonPath("$.property", is("some value")));
    

    or even a test that the property is null:

    .andExpect(jsonPath("$.property").value(IsNull.nullValue()));
    

    correspond to a json like:

    {
    ...
    "property": "some value",
    ...
    }
    

    where the important part is the left side, that is the existence of "property":

    Instead, @JsonIgnore is not producing the porperty in the output at all, so you can't expect it not in the test nor in the production output. If you don't want the property in the output, it's fine, but you can't expect it in test. If you want it empty in output (both in prod and test) you want to create a static Mapper method in the middle that is not passing the value of the property to the json object:

    Mapper.mapPersonToRest(User user) {//exclude the password}
    

    and then your method would be:

    @RequestMapping(value="/users/{userId}", method= RequestMethod.GET)
    public ResponseEntity getUser(@PathVariable Long userId) {
        logger.info("Request arrived for getUser() with params {}", userId);
        User user = Mapper.mapPersonToRest(userService.getUserById(userId));
        if(user != null) {
            UserResource userResource = new UserResourceAsm().toResource(user);
            return new ResponseEntity<>(userResource, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }
    

    At this point, if your expectations are for Mapper.mapPersonToRest to return a user with a null password, you can write a normal Unit test on this method.

    P.S. Of course the password is crypted on the DB, right? ;)

提交回复
热议问题