在.forward(req,resp)之后HttpServletRequest有什么问题?

时间:2017-06-20 16:30:09

标签: java servlets mocking mockito

我测试了获取jsp文件的简单Servlet。在此servlet操作request.setAttribute("key", "value")中,但在我.forward()之后致电request.getAttribute("key")后,我得到了null。为什么会这样?此行为在模拟对象中确定forward或原因?

这是Servlet的doPost

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    final boolean success = addUserInDatabase(req);

    if (success) req.setAttribute("serverAnswer", EDIT_SUCCESS.get());//this write value
    else req.setAttribute("serverAnswer", ERR_UNIQUE_L_P.get());

    req.getRequestDispatcher(ANSWER.get())
            .forward(req, resp);
}

这是测试:

//mock http.
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);


RequestDispatcher dispatcher = mock(RequestDispatcher.class);
when(request.getRequestDispatcher(ANSWER.get()))
                  .thenReturn(dispatcher);
servlet.doPost(request, response);
String result = (String) request.getAttribute("serverAnswer");//get value
Assert.assertThat(result, is(EDIT_SUCCESS.get()));// result == null

为什么我得到Null?在致电setAttribute后,是否有可能获得forward的价值?如何测试这种行为?谢谢。

2 个答案:

答案 0 :(得分:1)

尝试request.getAttribute("serverAnswer").toString();并使用.include(request, response);

答案 1 :(得分:1)

如果在调用servlet上的String result = (String)req.getAttribute("serverAnswer");之前添加req.getRequestDispatcher(ANSWER.get())并检查result的值,它仍然为空。

原因是你的请求对象不是真实的,而是嘲笑的。你必须做这样的事情。

when(request.getAttribute(eq("serverAnswer"))).thenReturn(EDIT_SUCCESS.get());