Spring MVC controller Test - print the result JSON String

JavaJsonSpring MvcJunit4

Java Problem Overview


Hi I have a Spring mvc controller

@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;
}

I want to see how the JSON String will looks like when I run this. I wrote this test case

@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 ?
	}
}

How to get the JSON string?

I am using Spring 3, codehause Jackson 1.8.4

Java Solutions


Solution 1 - Java

Try this code:

resultActions.andDo(MockMvcResultHandlers.print());

Solution 2 - Java

The trick is to use andReturn()

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

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

Solution 3 - Java

You can enable printing response of each test method when setting up the MockMvc instance.

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

Notice the .alwaysDo(MockMvcResultHandlers.print()) part of the above code. This way you can avoid applying print handler for each test method.

Solution 4 - Java

For me it worked when I used the code below:

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

And it worked !! :D

Hope I can help the other with my answer

Solution 5 - Java

If you are testing the Controller, you won't get the JSon result, which is returned by the view. Whether you can test the view (or test the controller and then the view), or starting a servlet contrainer (with Cargo for example), and test at HTTP level, which is a good way to check what really happen.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioniCodeView Question on Stackoverflow
Solution 1 - JavaJB NizetView Answer on Stackoverflow
Solution 2 - JavajaxView Answer on Stackoverflow
Solution 3 - JavauiroshanView Answer on Stackoverflow
Solution 4 - JavaChris SimView Answer on Stackoverflow
Solution 5 - JavafunkygonoView Answer on Stackoverflow