web-dev-qa-db-fra.com

Existe-t-il une méthode construite au printemps MockMVC pour obtenir le contenu json en tant qu'objet?

Dans mon projet Spring, j'ai créé des tests qui vérifient les contrôleurs/http-api. Existe-t-il un moyen d'obtenir le contenu json de la réponse en tant qu'objet désérialisé?

Dans d'autres projets, j'ai utilisé le repos assuré et des méthodes pour obtenir des résultats directement en tant qu'objets attendus.

Voici un exemple:

    MvcResult result = rest.perform( get( "/api/byUser" ).param( "userName","test_user" ) )

            .andExpect( status().is( HttpStatus.OK.value() ) ).andReturn();
    String string = result.getResponse().getContentAsString();

La méthode renvoie un type spécifique en tant que json. comment reconvertir ce json en objet pour tester son contenu? Je connais des moyens avec jackson ou avec du repos, mais y a-t-il un moyen au printemps/test/mockmvc

Comme getContentAs(Class)

11
dermoritz

Pour autant que je sache, MockHttpServletResponse (contrairement à RestTemplate) n'a pas de méthode qui pourrait convertir le json retourné en un type particulier
Donc ce que vous pourriez faire est d'utiliser Jakson ObjectMapper pour convertir la chaîne json en un type particulier

Quelque chose comme ça

String json = rt.getResponse().getContentAsString();
SomeClass someClass = new ObjectMapper().readValue(json, SomeClass.class);

Cela vous donnera plus de contrôle pour affirmer différentes choses.

Ayant dit cela, MockMvc::perform renvoie ResultActions qui a une méthode andExpect qui prend ResultMatcher. Cela a beaucoup d'options pour tester le json résultant sans le convertir en objet.

Par exemple

mvc.perform(  .....
                ......
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.firstname").value("john"))
                .andExpect(jsonPath("$.lastname").value("doe"))
                .andReturn();
10
pvpkiran