我正在使用 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();
}
老实说,我对 Struts 2 了解不多,所以我需要一点帮助。我一直在看这个带有嵌入式 tomcat 示例的 cucumber-jvm,但我很难理解。
我也一直在看这个Struts 2 Junit Tutorial。遗憾的是,它并没有很好地涵盖所有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);
}
}