2014-01-29 17 views
2

我有一个提供下载文件功能的控制器。如何使用ArgumentCaptor来验证写入HttpServletResponse的字节

@ResponseBody 
public void downloadRecycleResults(String batchName, HttpServletResponse response) throws Exception { 
    File finalResultFile = null; 
    // code here generates and initializes finalResultFile for batchName 
    response.setContentType("application/octet-stream"); 
    response.setHeader("Content-Disposition", "attachment;filename=" + finalResultFile.getName()); 
    IOUtils.copy(new FileReader(finalResultFile), response.getOutputStream()); 
} 

我无法弄清楚如何编写测试,我可以确认这是写给response内容。我已经使用了很多ArgumentCaptor,但不知何故它似乎不适合这里。要做到这一点

controller.downloadRecycleResults("batchName", mock(HttpServletResponse.class)); 
verify(response).getOutputStream(); // but how to capture content? 

回答

2

一种方法是嘲笑既response和输出流,然后验证你的嘲笑输出流的write方法调用。

+0

谢谢你的想法。我在发布后也想到了这一点。我会发布代码作为答案,以防有人绊倒。 – RandomQuestion

6

正如David所说,我能够这样做。

ServletOutputStream opStreamMock = mock(ServletOutputStream.class); 
when(response.getOutputStream()).thenReturn(opStreamMock); 

ArgumentCaptor<byte[]> captor = ArgumentCaptor.forClass(byte[].class); 
verify(opStreamMock).write(captor.capture(), Mockito.anyInt(), Mockito.anyInt()); 

//can create reader now. 
BufferedReader reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(captor.getValue()))); 
相关问题