Java 如何在验收测试期间从Struts 2获取ActionContext?
我正在使用cucumber jvm在Struts 2和Tomcat作为Servlet容器的应用程序上编写验收测试(测试行为)。在代码中的某个时刻,我需要从Struts 2Java 如何在验收测试期间从Struts 2获取ActionContext?,java,struts2,bdd,cucumber-jvm,actioncontext,Java,Struts2,Bdd,Cucumber Jvm,Actioncontext,我正在使用cucumber jvm在Struts 2和Tomcat作为Servlet容器的应用程序上编写验收测试(测试行为)。在代码中的某个时刻,我需要从Struts 2HttpSession获取用户,该会话由一个HttpServletRequest创建 因为我在做测试,而不是运行Tomcat,所以我没有一个活动会话,我得到了一个NullPointerException 以下是我需要调用的代码: public final static getActiveUser() { return (
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();
}
老实说,我对Struts2了解不多,所以我需要一些帮助。我一直在看这个例子,但我很难理解
我也一直在看这个。遗憾的是,它没有很好地涵盖所有的StrutsTestCase
特性,而且它是最简单的用例(考虑到所有这些,这是一个非常无用的教程)
那么,如何像用户使用应用程序一样运行验收测试呢
更新: 感谢史蒂文·贝尼特斯的回答 我必须做两件事:
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);
}
公共类StepDefs{
用户;
HttpServletRequest请求;
http会议;
@以前
公开考试{
//创建用户
//使用mockito模拟会话
session=Mockito.mock(HttpSession.class);
Mockito.when(session.getAttribute(“活动用户”)。然后返回(用户);
//模拟HttpServletRequest
request=Mockito.mock(HttpServletRequest);
Mockito.when(request.getSession()).thenReturn(session);
//设置上下文
Map contextMap=newhashmap();
put(strutstatics.HTTP_请求,请求);
setContext(新的ActionContext(contextMap));
}
@之后
公开测试(){
user=null;
请求=null;
会话=空;
ActionContext.setContext(null);
}
}一个
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));
此示例仅提供您正在测试的方法所需的内容。如果您需要基于此处未提供的代码在映射中添加其他条目,则只需相应地添加它们即可
希望这能有所帮助。谢谢你的回答!我会尝试并尽快回复。效果很好!由于评论不允许使用格式化代码,我将更新我的问题。谢谢!很高兴这有帮助。顺便说一句,Mockito rocks!顺便说一句,你可以通过让你的操作实现
SessionAware
接口来简化你的操作和测试。这将导致Struts2注入由HttpSession
支持的基本映射。
ActionContext.setContext(null);