我测试了获取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
的价值?如何测试这种行为?谢谢。
答案 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());