Mockito和HttpServletResponse - 将输出写入textfile

jan*_*jan 9 java unit-testing servlets mocking mockito

我想用mockito测试我的servlet.我也想知道服务器输出是什么.所以如果servlet写出这样的东西:

HttpServletResponse.getWriter().println("xyz");
Run Code Online (Sandbox Code Playgroud)

我想把它写成文本文件.我为HttpServletResponse创建了模拟,并告诉Mockito如果调用了HttpServletResponse.getWriter(),它应该返回我的自定义PrintWriter:

HttpServletResponse resp = mock(HttpServletResponse.class);
PrintWriter writer = new PrintWriter("somefile.txt");
when(resp.getWriter()).thenReturn(writer);
Run Code Online (Sandbox Code Playgroud)

生成文本文件,但它是空的.我怎样才能使这个工作?

编辑:

@Jonathan:这实际上是真的,嘲笑作家也是一个更清洁的解决方案.解决了这个问题

StringWriter sw = new StringWriter();
PrintWriter pw  =new PrintWriter(sw);

when(resp.getWriter()).thenReturn(pw);
Run Code Online (Sandbox Code Playgroud)

然后我可以检查StringWriter的内容,而不必处理文件.

PCa*_*che 9

如果您碰巧使用 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();
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*han 5

要查看任何输出,PrintWriter您需要close()flush()它。

PrintWriter或者,您可以使用autoFlush参数创建,例如:

final FileOutputStream fos = new FileOutputStream("somefile.txt");
final PrintWriter writer = new PrintWriter(fos, true); // <-- autoFlush
Run Code Online (Sandbox Code Playgroud)

println当,printf或被调用时,这将写入文件format

我想说关闭PrintWriter是更好的选择。

在旁边:

你有没有考虑过嘲笑Writer?您可以避免写入文件并验证预期的调用,例如:

verify(writer).println("xyz");
Run Code Online (Sandbox Code Playgroud)