Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jmock如何与HttpSession和HttpServletRequest一起使用_Java_Junit_Mocking_Jmock - Fatal编程技术网

Java Jmock如何与HttpSession和HttpServletRequest一起使用

Java Jmock如何与HttpSession和HttpServletRequest一起使用,java,junit,mocking,jmock,Java,Junit,Mocking,Jmock,我是jmock的新手,尝试模拟HttpSession。我得到: java.lang.AssertionError:意外调用:httpServletRequest.getSession() 未指定期望值:您是否。。。 -忘记用基数子句开始期望? -调用模拟方法以指定期望的参数 试验方法: @试验 我已经做了一些搜索,现在还不清楚这是怎么做到的。感觉好像我错过了一些小东西。任何有这方面经验的人都可以给我指出正确的方向。 谢谢我认为您需要告诉JMock上下文,在实际执行并调用该方法之前,您希望调用该方

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

java.lang.AssertionError:意外调用:httpServletRequest.getSession() 未指定期望值:您是否。。。 -忘记用基数子句开始期望? -调用模拟方法以指定期望的参数

试验方法:

@试验

我已经做了一些搜索,现在还不清楚这是怎么做到的。感觉好像我错过了一些小东西。任何有这方面经验的人都可以给我指出正确的方向。
谢谢

我认为您需要告诉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()'子句,它有效地阻止了调用。它允许您随时拨打电话。我们通常“允许”不改变协作者状态的查询