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

时间:2015-04-22 00:29:04

标签: java unit-testing junit mockito jmock

考虑这个例子

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

答案 0 :(得分:3)

你需要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));

答案 1 :(得分:1)

我不会对Writer使用模拟。您希望测试输出是否被写入,而不是导致输出被写入的交互。

相反,使用真实对象:

HttpServletResponse mockResponse
    = context.mock(HttpServletResponse.class);
StringWriter writer = new StringWriter();

...

atLeast(1).of(mockResponse).getWriter();
will(returnValue(writer));