无法获得Junit测试的会话

时间:2013-09-03 22:33:00

标签: session servlets struts2 junit junit4

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

但是,它仍然会抛出空指针错误。系统能够成功找到获取上下文,但是当它试图获取会话时,它就会死在我身上。我也尝试了几种不同的方法来实现同样的目标无济于事。知道我做错了什么吗?

2 个答案:

答案 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对象,例如HttpServletRequestServletContext