【问题标题】:unable to put spy on HttpSession / Mockito无法监视 HttpSession / Mockito
【发布时间】:2014-03-28 07:49:16
【问题描述】:

我想对Httpsession 进行部分模拟,但为此我需要监视它而不是模拟它,而且如果没有已经模拟的请求对象,我就无法获得这个接口。

请帮忙。

换句话说,如果没有HttpServletRequest 对象,我如何获得HttpSession 的对象。

更多细节::

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

简而言之,对HttpSession 进行部分模拟。

【问题讨论】:

  • 再描述一下您的用例。你到底想达到什么目标?
  • 我想部分模拟 HttpSession。
  • 正如我所说,描述您的用例 - 不是您在技术上想要做什么,而是您想要实现。你在测试吗?您的问题的更大背景是什么?
  • 已更改原帖,请重读。

标签: java unit-testing mockito


【解决方案1】:

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

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

【讨论】:

  • 谢谢,已经试过了,效果很好,非常感谢@Pbielicki
【解决方案2】:

只需自己实现接口 HttpSession(我将其命名为 FakeHttpSession,基于 Martin Fowlers bliki 中提出的名称)。

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

【讨论】:

  • 谢谢 Jens,看来这可能行得通,让我试一试,bbl :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
相关资源
最近更新 更多