无法将间谍放在HttpSession/Mockito上

Viv*_*vek 4 java unit-testing mockito

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

请帮忙.

换句话说,我怎样才能得到HttpSession没有HttpServletRequest物体的物体.

更多详情::

有一个我要测试的servlet,servlet有会话,并在会话中放入"loginBean"(包含loged在用户相关信息中),我已经嘲笑过并且工作正常,现在在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.

pbi*_*cki 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
Run Code Online (Sandbox Code Playgroud)

然后在你的测试中你将拥有:

when(request.getSession()).thenReturn(new MockHttpSession());
Run Code Online (Sandbox Code Playgroud)