Java Jmock如何与HttpSession和HttpServletRequest一起使用
我是jmock的新手,尝试模拟HttpSession。我得到: java.lang.AssertionError:意外调用:httpServletRequest.getSession() 未指定期望值:您是否。。。 -忘记用基数子句开始期望? -调用模拟方法以指定期望的参数 试验方法: @试验 我已经做了一些搜索,现在还不清楚这是怎么做到的。感觉好像我错过了一些小东西。任何有这方面经验的人都可以给我指出正确的方向。Java Jmock如何与HttpSession和HttpServletRequest一起使用,java,junit,mocking,jmock,Java,Junit,Mocking,Jmock,我是jmock的新手,尝试模拟HttpSession。我得到: java.lang.AssertionError:意外调用:httpServletRequest.getSession() 未指定期望值:您是否。。。 -忘记用基数子句开始期望? -调用模拟方法以指定期望的参数 试验方法: @试验 我已经做了一些搜索,现在还不清楚这是怎么做到的。感觉好像我错过了一些小东西。任何有这方面经验的人都可以给我指出正确的方向。 谢谢我认为您需要告诉JMock上下文,在实际执行并调用该方法之前,您希望调用该方
谢谢我认为您需要告诉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上很有用(我当然有)。我认为您需要告诉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上使用过,您可能会发现它很有用(我当然有)。您不需要模拟请求对象。由于您正在测试的方法(
dwnLoadCel.doAuthorization()
)只依赖于HttpSession
对象,因此您应该模拟该对象。因此,您的代码如下所示:
public void testDoAuthorization(){
final HttpSession session = context.mock(HttpSession.class);
context.checking(new Expectations(){{
// ???
}});
assertTrue(dwnLoadCel.doAuthorization(session));
}
问题是:您希望SUT对会话对象实际做什么?您需要在期望中表示对
会话
的调用及其相应的返回值,这些值应该会导致doAuthorization
返回true
您不需要模拟请求对象。由于您正在测试的方法(dwnLoadCel.doAuthorization()
)只依赖于HttpSession
对象,因此您应该模拟该对象。因此,您的代码如下所示:
public void testDoAuthorization(){
final HttpSession session = context.mock(HttpSession.class);
context.checking(new Expectations(){{
// ???
}});
assertTrue(dwnLoadCel.doAuthorization(session));
}
问题是:您希望SUT对会话对象实际做什么?您需要在您的期望中表达对
会话的调用
及其相应的返回值,它们应该导致doAuthorization
返回true
,这帮助我朝着正确的方向前进。我只需要使用httpssession并升级我的hamcrest版本。这帮助我朝着正确的方向前进。我只需要使用httpssession并升级我的hamcrest版本。回答得好。在回顾了这个问题之后,看看dwnLoadCel用于doAuthorization的类似乎是合理的。也许重构是一种选择。对于记录,jMock中有'allowing()'子句,它有效地阻止了调用。它允许您随时拨打电话。我们通常“允许”不改变collaboratorgood答案状态的查询。在回顾了这个问题之后,看看dwnLoadCel用于doAuthorization的类似乎是合理的。也许重构是一种选择。对于记录,jMock中有'allowing()'子句,它有效地阻止了调用。它允许您随时拨打电话。我们通常“允许”不改变协作者状态的查询