在验收测试期间如何从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的回答!

我必须做两件事:

  1. 按照建议模拟HttpServletRequest,
  2. 模拟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);

本示例仅提供您需要测试的方法。如果您需要根据此处未提供的代码在地图中添加其他条目,请相应地添加它们。

希望能有所帮助。