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

时间:2013-07-18 13:07:10

标签: java struts2 bdd cucumber-jvm actioncontext

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

我一直在看这个Struts 2 Junit Tutorial。遗憾的是,它并没有很好地涵盖所有StrutsTestCase功能,而且它是最简单的用例(所有这些都被认为是一个非常无用的教程)。

那么,我如何运行验收测试,就好像用户正在使用该应用程序一样?


更新:

感谢Steven Benitez的回答!

我必须做两件事:

  1. 按照建议模拟HttpServletRequest,
  2. 模拟HttpSession以获取我想要的属性。
  3. 这是我在我的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);
        }
    

    }

1 个答案:

答案 0 :(得分:2)

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);

此示例仅提供您正在测试的方法所需的内容。如果您需要根据此处未提供的代码在地图中添加其他条目,则只需相应添加它们即可。

希望有所帮助。