如何使用ArgumentCaptor验证写入HttpServletResponse的字节

时间:2014-01-29 23:48:20

标签: java mockito

我有一个控制器,提供下载文件的功能。

@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 个答案:

答案 0 :(得分:9)

正如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())));

答案 1 :(得分:2)

执行此操作的一种方法是模拟response及其输出流,然后验证对模拟输出流的write方法的调用。