如何模拟模拟对象的方法调用?

How to mock method calls of mock objects?

考虑这个例子

    resp.getWriter().write(Collections.singletonMap("path", file.getAbsolutePath()).toString());

其中 respHttpServletResponse 并且被嘲笑了。

我正在使用 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));