こんにちは、Spring mvcコントローラーがあります
@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;
}
これを実行したときにJSON文字列がどのように見えるかを確認したいと思います。このテストケースを書きました
@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 ?
}
}
JSON文字列を取得する方法は?
私はSpring 3、codehause Jackson 1.8.4を使用しています
このコードを試してください:
resultActions.andDo(MockMvcResultHandlers.print());
トリックはandReturn()
を使用することです
MvcResult result = springMvc.perform(MockMvcRequestBuilders
.get("/jobsdetails/2").accept(MediaType.APPLICATION_JSON)).andReturn();
String content = result.getResponse().getContentAsString();
MockMvc
インスタンスをセットアップするときに、各テストメソッドの応答の印刷を有効にできます。
_springMvc = MockMvcBuilders.webAppContextSetup(wContext)
.alwaysDo(MockMvcResultHandlers.print())
.build();
_
上記のコードの.alwaysDo(MockMvcResultHandlers.print())
部分に注目してください。これにより、各テストメソッドに印刷ハンドラーを適用することを回避できます。
私にとっては、以下のコードを使用したときに機能しました:
ResultActions result =
this.mockMvc.perform(post(resource).sessionAttr(Constants.SESSION_USER, user).param("parameter", "parameterValue"))
.andExpect(status().isOk());
String content = result.andReturn().getResponse().getContentAsString();
そしてそれは働いた!! :D
私の答えで他の人を助けられることを願っています
コントローラーをテストしている場合、ビューによって返されるJSonの結果は取得されません。ビューをテストできるか(またはコントローラーを表示してからビューをテストするか)、サーブレットコントリナーを(たとえばCargoを使用して)開始し、HTTPレベルでテストできるかどうか。