Mockito和HttpServletResponse - 将输出写入textfile

时间:2014-04-25 11:44:17

标签: java unit-testing servlets mocking mockito

我想使用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的内容,而不必处理文件。

3 个答案:

答案 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

当调用printlnprintfformat时,这将写入文件。

我想说关闭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