4

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

由于我正在进行测试并且没有运行 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 示例的 cucumber-jvm,但我很难理解。

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

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


更新:

感谢史蒂文贝尼特斯的回答!

我必须做两件事:

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

}

4

1 回答 1

2

AnActionContext是每个请求的对象,表示执行操作的上下文。静态方法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);

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

希望有帮助。

于 2013-07-18T15:27:00.827 回答