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

我在一个使用Struts 2和Tomcat作为我的Servlet容器的应用程序上使用cucumber-jvm编写验收测试(测试行为).在我的代码中的某个时刻,我需要从HttpServletRequest创建的Struts 2 HttpSession中获取用户.

由于我正在进行测试而没有运行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的回答!

我不得不做两件事:

>按照建议模拟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);
    }

}

解决方法:

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

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

希望有所帮助.

上一篇:定义band字段在 Mybatis中关于OGNL表达式会出现冲突Malformed OGNL expression


下一篇:Ubuntu使用root登录系统