Java 如何在验收测试期间从Struts 2获取ActionContext?

Java 如何在验收测试期间从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 (

我正在使用cucumber jvm在Struts 2和Tomcat作为Servlet容器的应用程序上编写验收测试(测试行为)。在代码中的某个时刻,我需要从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();
}
老实说,我对Struts2了解不多,所以我需要一些帮助。我一直在看这个例子,但我很难理解

我也一直在看这个。遗憾的是,它没有很好地涵盖所有的
StrutsTestCase
特性,而且它是最简单的用例(考虑到所有这些,这是一个非常无用的教程)

那么,如何像用户使用应用程序一样运行验收测试呢


更新: 感谢史蒂文·贝尼特斯的回答

我必须做两件事:

  • 按照建议模拟HttpServletRequest
  • 模拟HttpSession以获得我想要的属性
  • 以下是我添加到cucumber 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);
        }
    
    公共类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);