0

我是 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));
}

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

4

2 回答 2

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

于 2008-10-23T19:34:08.967 回答
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会话对象中的一个或某个参数值)——这将使您的单元测试更容易(对 servlet 容器的依赖关系消失)。

我认为你已经在你的类中进行了某种程度的依赖注入,但是你可能依赖于一个过于广泛的对象。谷歌测试博客最近有很多关于 DI 的优秀 文章,你可能会觉得有用(我当然有)。

于 2008-10-23T16:40:32.293 回答