web-dev-qa-db-fra.com

Spring MVC Test Test - Imprimer le résultat JSON String

Salut j'ai un contrôleur mvc printemps

@RequestMapping(value = "/jobsdetails/{userId}", method = RequestMethod.GET)
@ResponseBody
public List<Jobs> jobsDetails(@PathVariable Integer userId,HttpServletResponse response) throws IOException {
    try {       
        Map<String, Object> queryParams=new LinkedHashMap<String, Object>(); 

        queryParams.put("userId", userId);

        jobs=jobsService.findByNamedQuery("findJobsByUserId", queryParams);

    } catch(Exception e) {
        logger.debug(e.getMessage());
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
    }
    return jobs;
}

Je veux voir à quoi ressemblera la chaîne JSON lorsque j'exécuterai cette opération. J'ai écrit ce cas de test

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("classpath:webapptest")
@ContextConfiguration(locations = {"classpath:test-applicationcontext.xml"})
public class FindJobsControllerTest {
private MockMvc springMvc;

    @Autowired
    WebApplicationContext wContext;

    @Before
    public void init() throws Exception {
        springMvc = MockMvcBuilders.webAppContextSetup(wContext).build();
    }

    @Test
    public void documentsPollingTest() throws Exception {
        ResultActions resultActions = springMvc.perform(MockMvcRequestBuilders.get("/jobsdetails/2").accept(MediaType.APPLICATION_JSON));

        System.out.println(/* Print the JSON String */); //How ?
    }
}

Comment obtenir la chaîne JSON?

J'utilise Spring 3, codehause Jackson 1.8.4

52
iCode

Essayez ce code:

resultActions.andDo(MockMvcResultHandlers.print());
117
JB Nizet

L'astuce consiste à utiliser andReturn()

MvcResult result = springMvc.perform(MockMvcRequestBuilders
         .get("/jobsdetails/2").accept(MediaType.APPLICATION_JSON)).andReturn();

String content = result.getResponse().getContentAsString();
67
jax

Vous pouvez activer la réponse d’impression de chaque méthode de test lors de la configuration de l’instance MockMvc.

springMvc = MockMvcBuilders.webAppContextSetup(wContext)
               .alwaysDo(MockMvcResultHandlers.print())
               .build();

Notez la partie .alwaysDo(MockMvcResultHandlers.print()) du code ci-dessus. De cette façon, vous pouvez éviter d’appliquer un gestionnaire d’impression pour chaque méthode de test.

9
uiroshan

Pour moi cela a fonctionné quand j'ai utilisé le code ci-dessous:

ResultActions result =
     this.mockMvc.perform(post(resource).sessionAttr(Constants.SESSION_USER, user).param("parameter", "parameterValue"))
        .andExpect(status().isOk());
String content = result.andReturn().getResponse().getContentAsString();

Et ça a marché !! :RÉ

J'espère pouvoir aider l'autre avec ma réponse

8
Chris Sim

Si vous testez le contrôleur, vous n'obtiendrez pas le résultat JSon, qui est renvoyé par la vue. Si vous pouvez tester la vue (ou le contrôleur puis la vue), ou démarrer un contrainer de servlet (avec Cargo par exemple), et tester au niveau HTTP, ce qui est un bon moyen de vérifier ce qui se passe réellement.

0
funkygono