如何模拟模拟对象的方法调用?
How to mock method calls of mock objects?
考虑这个例子
resp.getWriter().write(Collections.singletonMap("path", file.getAbsolutePath()).toString());
其中 resp
是 HttpServletResponse
并且被嘲笑了。
我正在使用 JMock
Mockery 来模拟这些
我的代码看起来像
try {
atLeast(1).of(resp).getWriter().write(String.valueOf(any(String.class)));
} catch (IOException e) {
e.printStackTrace();
}
will(returnValue("Hello"));
当我运行这个时,我得到
java.lang.NullPointerException
我相信这是即将到来的,因为 getWriter()
没有发送回任何东西
我该如何处理这种情况?
您需要 2 个模拟对象。
HttpServletResponse resp = context.mock(HttpServletResponse.class);
Writer writer = context.mock(Writer.class);
...
atLeast(1).of(resp).getWriter();
will(returnValue(writer));
allowing(writer).write(with(any(String.class));
我不会为 Writer
使用模拟。您想要测试输出是否被写入,而不是导致输出被写入的交互。
改为使用真实对象:
HttpServletResponse mockResponse
= context.mock(HttpServletResponse.class);
StringWriter writer = new StringWriter();
...
atLeast(1).of(mockResponse).getWriter();
will(returnValue(writer));
考虑这个例子
resp.getWriter().write(Collections.singletonMap("path", file.getAbsolutePath()).toString());
其中 resp
是 HttpServletResponse
并且被嘲笑了。
我正在使用 JMock
Mockery 来模拟这些
我的代码看起来像
try {
atLeast(1).of(resp).getWriter().write(String.valueOf(any(String.class)));
} catch (IOException e) {
e.printStackTrace();
}
will(returnValue("Hello"));
当我运行这个时,我得到
java.lang.NullPointerException
我相信这是即将到来的,因为 getWriter()
没有发送回任何东西
我该如何处理这种情况?
您需要 2 个模拟对象。
HttpServletResponse resp = context.mock(HttpServletResponse.class);
Writer writer = context.mock(Writer.class);
...
atLeast(1).of(resp).getWriter();
will(returnValue(writer));
allowing(writer).write(with(any(String.class));
我不会为 Writer
使用模拟。您想要测试输出是否被写入,而不是导致输出被写入的交互。
改为使用真实对象:
HttpServletResponse mockResponse
= context.mock(HttpServletResponse.class);
StringWriter writer = new StringWriter();
...
atLeast(1).of(mockResponse).getWriter();
will(returnValue(writer));