在验收测试期间如何从Struts 2获取ActionContext?
问题内容:
我在以Struts 2和Tomcat作为我的Servlet容器的应用程序上使用cumulage-
jvm编写了接受测试(测试行为)。在代码的某个时刻,我需要从Struts 2
HttpSession
(由创建的)中获取用户HttpServletRequest
。
由于我正在测试并且未运行Tomcat,因此我没有活动的会话,并且得到了NullPointerException
。
这是我需要调用的代码:
public final static getActiveUser() {
return (User) getSession().getAttribute("ACTIVE_USER");
}
和getSession方法:
public final static HttpSession getSession() {
final HttpServletRequest request (HttpServletRequest)ActionContext.
getContext().get(StrutsStatics.HTTP_REQUEST);
return request.getSession();
}
老实说,我对Struts
2不太了解,所以我需要一些帮助。我一直在看这个带有嵌入式tomcat例子的cumulage-
jvm,但我一直在努力理解。
我也一直在看这个Struts 2
Junit教程。可悲的是,它并没有很好地涵盖所有StrutsTestCase
功能,并且是最简单的用例(都被认为是一个非常无用的教程)。
因此,如何像用户正在使用应用程序一样运行验收测试?
更新:
感谢Steven Benitez的回答!
我必须做两件事:
- 按照建议模拟HttpServletRequest,
- 模拟HttpSession以获取我想要的属性。
这是我添加到cumul-jvm测试中的代码:
public class StepDefs {
User user;
HttpServletRequest request;
HttpSession session;
@Before
public void prepareTests() {
// create a user
// mock the session using mockito
session = Mockito.mock(HttpSession.class);
Mockito.when(session.getAttribute("ACTIVE_USER").thenReturn(user);
// mock the HttpServletRequest
request = Mockito.mock(HttpServletRequest);
Mockito.when(request.getSession()).thenReturn(session);
// set the context
Map<String, Object> contextMap = new HashMap<String, Object>();
contextMap.put(StrutsStatics.HTTP_REQUEST, request);
ActionContext.setContext(new ActionContext(contextMap));
}
@After
public void destroyTests() {
user = null;
request = null;
session = null;
ActionContext.setContext(null);
}
}
问题答案:
An
ActionContext
是一个按请求的对象,代表在其中执行操作的上下文。静态方法getContext()
和setContext(ActionContext context)
受的支持ThreadLocal
。在这种情况下,您可以在测试前调用它:
Map<String, Object> contextMap = new HashMap<String, Object>();
contextMap.put(StrutsStatics.HTTP_REQUEST, yourMockHttpServletRequest);
ActionContext.setContext(new ActionContext(contextMap));
然后使用以下命令清理它:
ActionContext.setContext(null);
本示例仅提供您需要测试的方法。如果您需要根据此处未提供的代码在地图中添加其他条目,请相应地添加它们。
希望能有所帮助。