【问题标题】:Easymock expectLastCallEasymock expectLastCall
【发布时间】:2015-05-29 09:34:47
【问题描述】:

我正在使用带有 junit 的 Easymock 来编写我的单元测试。我对此有疑问,我找不到一个非常清晰的解释。
你如何测试 void 方法
由于他们不返回任何东西,所以类似:

Easymock.expect(myMockObject.func(easymock.isa(String.class))).andReturn("NOTHING TO RETURN HERE");

以上方法行不通,因为我没有什么可归还的。
那么,如何设定我的期望以及如何测试 void 方法?
我开始知道像 easymock.expectLastCall() 这样的东西会适合,但我不确定它的作用以及我们为什么需要它。 一个清晰的解释将不胜感激。

【问题讨论】:

    标签: unit-testing junit easymock


    【解决方案1】:

    首先使用easymock,您不是在测试要测试的方法,而是在模拟它调用的方法。 例如:

    public void doSomething(){
      i = otherObject.foo();
      otherObject.bar();
    }
    

    doSomething() 方法是您要测试的方法。 i 是你的类的成员变量,假设是一个整数。调用otherObject.foo()otherObject.bar() 是对另一个可以模拟的对象的方法调用(也许它们很难设置,而您只想模拟它们......)。现在假设 bar() 是一个 void 方法,那么对于 otherObject.foo() 你可以设置一个正常的期望,但对于 bar() 你需要expectLastCall()

    当你测试一个 void 方法 (doSomething()) 时,你想检查它的副作用......它改变了集合吗?它是否创建了一个新对象?或者,在本例中,i 的值是否发生了变化?

    【讨论】:

    • 感谢您的解释。请解释一下:当我们设置一个正常的easymock期望时,我们指定调用哪个方法应该返回什么(类似于easymock.expect(obj.func()).andReturn(.....)但是使用expectLastCall,你不指定要模拟的方法?那么,它怎么知道要模拟哪个方法调用?我的意思是,如果我们有一系列 3 个 void 方法调用怎么办。在这种情况下如何使用 expectLastCall ?
    • @KumarMrinal 你调用方法,然后调用easymock.expectLastCall()。使用给定的示例,我们首先对 foo 进行设置,然后对 bar 进行设置: easymock.expect(otherObject.foo()).andReturn(.....) ;其他对象.bar(); EasyMock.expectLastCall();
    • 所以,如果要测试的方法是这样的: public void doSomething(){ i = otherObject.foo();其他对象.bar();其他对象.set();其他对象.put();然后,为了测试这个场景,我们必须写类似:easymock.expect(otherObject.foo()).andReturn(.....); // for foo otherObject.bar(); EasyMock.expectLastCall(); // 对于酒吧 otherObject.set(); EasyMock.expectLastCall(); // 设置 otherObject.put(); EasyMock.expectLastCall(); // 对于 put 我的意思是每个前面的 void 方法都有一个 expectLastCall ?
    • 好问题!如果我没记错的话,您可以调用一次并指定调用次数:expectLastCall().times(4);
    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多