我想使用mockito测试我的servlet。我也想知道服务器输出是什么。因此,如果servlet写出这样的东西:
HttpServletResponse.getWriter().println("xyz");
我想把它写成文本文件。我为HttpServletResponse创建了模拟,并告诉Mockito如果调用了HttpServletResponse.getWriter(),它应该返回我的自定义PrintWriter:
HttpServletResponse resp = mock(HttpServletResponse.class);
PrintWriter writer = new PrintWriter("somefile.txt");
when(resp.getWriter()).thenReturn(writer);
生成文本文件,但它是空的。我怎样才能使这个工作?
修改
@Jonathan:其实这是真的,嘲笑作家也是一个更清洁的解决方案。像那样解决了StringWriter sw = new StringWriter();
PrintWriter pw =new PrintWriter(sw);
when(resp.getWriter()).thenReturn(pw);
然后我可以检查StringWriter的内容,而不必处理文件。
答案 0 :(得分:4)
要查看PrintWriter
的任何输出,您需要close()
或flush()
。
或者,您可以创建PrintWriter
with the autoFlush
parameter,例如:
final FileOutputStream fos = new FileOutputStream("somefile.txt");
final PrintWriter writer = new PrintWriter(fos, true); // <-- autoFlush
当调用println
,printf
或format
时,这将写入文件。
我想说关闭PrintWriter
更可取。
<强> 除了: 强>
您是否考虑过嘲笑Writer
?您可以避免写入文件并验证预期的调用,例如:
verify(writer).println("xyz");
答案 1 :(得分:0)
如果你碰巧使用Spring,那么它有一个MockHttpServletResponse类。
@Test
public void myTest() {
MockHttpServletResponse response = new MockHttpServletResponse();
// Do test stuff here
// Verify what was written to the response using MockHttpServletResponse's methods
response.getContentAsString();
response.getContentAsByteArray();
response.getContentLength();
}
答案 2 :(得分:0)
我知道这是一个较晚的答案,但是我只是想出了一种方法(无需写入文件)。我们可以使用org.springframework.mock.web.MockHttpServletResponse
。