My Struts2 Action类使用以下代码成功访问会话
ActionContext.getContext().getSession().clear();
但是,当我尝试使用Junit测试我的Action类时,我得到一个NullPointer异常 我一直在审查其他人在StackOverflow上发布的一些评论,并使用了以下代码:
HttpServletRequest request;
HttpSession session;
@Before
public void setUp() throws Exception {
request = Mockito.mock(HttpServletRequest.class);
request.setAttribute("beanList", beanList);
request = Mockito.mock(HttpServletRequest.class);
Mockito.when(request.getSession()).thenReturn(session);
Map<String, Object> contextMap = new HashMap<String, Object>();
contextMap.put(StrutsStatics.HTTP_REQUEST, request);
ActionContext.setContext(new ActionContext(contextMap));
}
但是,它仍然会抛出空指针错误。系统能够成功找到获取上下文,但是当它试图获取会话时,它就会死在我身上。我也尝试了几种不同的方法来实现同样的目标无济于事。知道我做错了什么吗?
答案 0 :(得分:4)
如何实例化或模拟会话?
session = mock(HttpSession.class);
之前打电话
Mockito.when(request.getSession()).thenReturn(session);
答案 1 :(得分:2)
使用依赖注入方法并更改您的操作以实现SessionAware
。然后,Struts2框架会将会话注入您的操作,例如下面的示例。最后,您可以通过简单地将Map注入您的操作来进行测试。
public class MyAction extends ActionSupport implements SessionAware {
private Map<String, Object> session;
public String execute() {
// do actiony stuff
return SUCCESS;
}
public void setSession(Map<String, Object> session) {
this.session = session;
}
}
仅供参考,ServletConfigInterceptor
处理执行此注入,并且可以使用相同类型的注入来访问其他servlet对象,例如HttpServletRequest
或ServletContext
。