代码之家  ›  专栏  ›  技术社区  ›  SWD

jmock如何与httpsession和httpservletrequest一起使用

  •  0
  • SWD  · 技术社区  · 17 年前

    我刚接触JMock,并试图模拟一个httpsession。我正在得到:

    断言错误:意外调用:httpservletrequest.getsession() 没有明确的期望:你… -忘记用基数子句开始期望了吗? -调用模拟方法来指定期望的参数?

    试验方法:

    @测试

    public void testDoAuthorization(){
    
        final HttpServletRequest request = context.mock(HttpServletRequest.class);
        final HttpSession session = request.getSession();
    
        context.checking(new Expectations(){{
           one(request).getSession(true); will(returnValue(session));
       }});
    
        assertTrue(dwnLoadCel.doAuthorization(session));
    }
    

    我已经做了一些搜索,但我仍然不清楚这是怎么做到的。我好像错过了一些小东西。任何有这方面经验的人都能给我指明正确的方向。 谢谢

    2 回复  |  直到 17 年前
        1
  •  2
  •   Kris Pruden    17 年前

    您不需要模拟请求对象。因为你测试的方法( dwnLoadCel.doAuthorization() )只取决于 HttpSession 对象,这是你应该嘲笑的。所以您的代码如下所示:

    public void testDoAuthorization(){
        final HttpSession session = context.mock(HttpSession.class);
    
        context.checking(new Expectations(){{
            // ???
        }});
    
        assertTrue(dwnLoadCel.doAuthorization(session));
    

    }

    问题是:你希望SUT实际做什么? 使用会话对象?你需要表达你的期望 session 它们对应的返回值 doAuthorization 返回 true .

        2
  •  1
  •   matt b    17 年前

    我认为您需要告诉jmock上下文您期望调用方法的次数,然后才能继续调用它。

    final HttpServletRequest request = context.mock(HttpServletRequest.class);
    
    context.checking(new Expectations(){{
      one(request).getSession(true); will(returnValue(session));
    }});
    
    final HttpSession session = request.getSession();
    

    我不太熟悉杰莫克,但你真的关心你的 dwnLoadCel 单元测试在模拟对象中调用了多少次特定方法?或者您只是在测试依赖于httpsession而没有实际会话的类?如果是后者的话,我认为JMock对你来说太过分了。

    您可能希望研究创建一个实现 HttpSession 只为单元测试(存根)而与您自己建立接口,并从中运行测试,或者您应该看看 DWN装载机 并确定 真的? 需要有对httpsession的引用,或者如果它只需要httpsession中的一些属性。重构 DWN装载机 只取决于它实际需要什么(a Map 或者会话对象中的某个参数值)-这将使单元测试更容易(对servlet容器的依赖性再见)。

    我认为你的类中已经有了某种程度的依赖注入,但是你可能对一个对象过于依赖。 The Google Test Blog 已经拥有 a lot of excellent articles 最近在DI上,你可能会发现有用的(我当然有)。