无法将间谍放在HttpSession / Mockito上

时间:2014-03-28 07:49:17

标签: java unit-testing mockito

我希望对Httpsession进行部分嘲讽,但为此我需要窥探而不是嘲笑它,而且这是一个我已经无法获得的请求对象无法获得的接口。

请帮忙。

换句话说,如何在没有HttpSession对象的情况下获得HttpServletRequest的对象。

MORE DETAIL ::

我想要测试一个servlet,servlet有会话,并在会话中放入“loginBean”(其中包含用户相关信息),我已经嘲笑过并且工作正常,现在在GUI级别,有2个选项卡,DetailSet1,detailsS​​et2,当你输入DetailSet1的数据时,它会被保存在会话中并且也会做一些业务逻辑,现在它来到DetailsS​​et2,你已经在会话中有了DetailSet1,所以它得到了它所需要的一切,数据保存在DB中。不,很明显我必须模拟HttpSession,因为我从容器外部运行单元格,但是存储的数据也在Httpsession,如果我也嘲笑那些,它就会破坏测试的目的。回到我开始的时候,我需要Httpsession对象来返回我模拟过的模拟数据,并且假设对于其他情况,它就像任何正常的HttpSession对象一样。比如,如果我执行session.setAttribute(“name”,“Vivek”),那么session.getAttribute("name")之后return "Vivek"应该null,但是如果是模拟对象则返回getAttribute("name")为什么?因为我没有对HttpSession的嘲笑行为。如果我仍然不能让任何人理解我的要求,我真的很抱歉。

简单地说,{{1}}上的部分嘲弄。

2 个答案:

答案 0 :(得分:5)

好吧,我明白了。你真的无法访问真正的会话对象,你也不会做任何间谍活动。你需要你的自制模拟(假):

public class MockHttpSession implements HttpSession {
  Map<String, Object> map = new HashMap<>();

  @Override
  public Object getAttribute(String name) {
    return map.get(name);
  }

  @Override
  public void setAttribute(String name, Object value) {
    map.put(name, value);
  }


  // implement rest of the methods you will use

然后在您的测试中,您将拥有:

when(request.getSession()).thenReturn(new MockHttpSession());

答案 1 :(得分:3)

自己实现接口HttpSession(我根据Martin Fowlers bliki中提出的名称命名为FakeHttpSession)。

然后你使用Mockito创建一个实例并监视它。