Jmock如何与HttpSession和HttpServletRequest一起使用

时间:2008-10-23 16:18:56

标签: java junit mocking jmock

我是jmock的新手并试图模仿HttpSession。我得到了:

java.lang.AssertionError:意外调用:httpServletRequest.getSession() 没有指定的期望:你......   - 忘记用基数条款开始期待?   - 调用模拟方法来指定期望的参数?

测试方法:

@Test

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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我认为您需要告诉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接口的类,仅用于单元测试(存根),然后运行测试,或者你应该看看dwnLoadCel并确定确实是否需要引用HttpSession,或者它是否只需要HttpSession中的某些属性。重构dwnLoadCel只取决于它实际需要的内容(一个Map或Session对象中的某个参数值) - 这将使您的单元测试更容易(依赖于servlet容器再见)。

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