【问题标题】:How is Jmock used with HttpSession and HttpServletRequestJmock 如何与 HttpSession 和 HttpServletRequest 一起使用
【发布时间】:2010-09-18 19:49:52
【问题描述】:

我是 jmock 的新手,正在尝试模拟 HttpSession。我得到:

java.lang.AssertionError:意外调用: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));
}

我进行了一些搜索,但我仍然不清楚这是如何完成的。感觉就像我错过了一些小块。任何有这方面经验的人都可以为我指明正确的方向。 谢谢

【问题讨论】:

    标签: java junit mocking jmock


    【解决方案1】:

    您不需要模拟请求对象。由于您正在测试的方法 (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

    【讨论】:

    • 这帮助我朝着正确的方向前进。我只需要使用 httpssession 并升级我的 hamcrest 版本。
    【解决方案2】:

    我认为您需要告诉 JMock 上下文,在您实际调用该方法之前,您希望该方法被调用多少次。

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

    我对 JMock 不是很熟悉,但你真的关心在你的dwnLoadCel 单元测试中被模拟对象中的某些方法被调用了多少次吗?或者你只是想测试你的类,它依赖于一个没有实际会话的 HttpSession?如果是后者,我认为 JMock 对你来说太过分了。

    您可能想考虑创建一个实现HttpSession 接口的类,仅用于单元测试(存根),然后运行您的测试,或者您应该看看@987654328 @ 并确定它是否真的 需要对 HttpSession 的引用,或者它是否只需要 HttpSession 中的一些属性。将dwnLoadCel 重构为仅取决于它实际需要的内容(Map 或 Session 对象中的某个参数值)——这将使您的单元测试更容易(与 servlet 容器的依赖关系消失)。

    我认为你已经在你的类中进行了某种程度的依赖注入,但你可能依赖于过于广泛的对象。 The Google Test Blog 最近在 DI 上有 a lot of excellent articles,您可能会觉得有用(我肯定有)。

    【讨论】:

    • 好答案。查看问题后,看一下 dwnLoadCel 用于 doAuthorization 的类似乎是合理的。也许重构是一种选择。
    • 作为记录,jMock 中有一个“allowing()”子句,它有效地存根调用。它允许您随意多次拨打电话。我们通常“允许”不改变协作者状态的查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多