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

3
我有一个控制器,提供下载文件的功能。
@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个回答

17

根据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())));

2

一种实现这个的方式是模拟response和它的输出流,然后验证对你模拟的输出流的write方法的调用。


谢谢你的想法。我发帖后也想到了这个。我会把代码作为答案发布,以防有人碰巧遇到同样的问题。 - RandomQuestion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接