23

我正在使用 EasyMock 进行一些单元测试,但我不了解EasyMock.expectLastCall(). 正如您在下面的代码中看到的那样,我有一个对象,该对象的方法返回 void 在其他对象的方法中被调用。我认为我必须让 EasyMock 期望该方法调用,但我尝试注释掉expectLastCall()调用并且它仍然有效。是因为我通过EasyMock.anyObject())了它将它注册为预期的呼叫还是发生了其他事情?

MyObject obj = EasyMock.createMock(MyObject.class);
MySomething something = EasyMock.createMock(MySomething.class);
EasyMock.expect(obj.methodThatReturnsSomething()).andReturn(something);

obj.methodThatReturnsVoid(EasyMock.<String>anyObject());

// whether I comment this out or not, it works
EasyMock.expectLastCall();

EasyMock.replay(obj);

// This method calls the obj.methodThatReturnsVoid()
someOtherObject.method(obj);

EasyMock 的 API 文档这样说expectLastCall()

Returns the expectation setter for the last expected invocation in the current thread. This method is used for expected invocations on void methods.
4

3 回答 3

27

IExpectationSetters此方法通过;返回您期望的句柄 这使您能够验证(断言)您的 void 方法是否被调用以及相关行为,例如

EasyMock.expectLastCall().once();
EasyMock.expectLastCall().atLeastOnce();
EasyMock.expectLastCall().anyTimes();

IExpectationSetters 的详细 API 在这里

在您的示例中,您只是获得了句柄而没有对其进行任何操作,因此您看不到拥有或删除该语句的任何影响。这与您调用一些 getter 方法或声明一些变量但不使用它非常相似。

于 2012-12-17T15:51:41.747 回答
3

EasyMock.expectLastCall();当您需要进一步验证“该方法已被调用。(与设置期望相同)”以外的任何内容时才需要

假设您想验证该方法被调用了多少次,因此您将添加以下任何一项:

EasyMock.expectLastCall().once();
EasyMock.expectLastCall().atLeastOnce();
EasyMock.expectLastCall().anyTimes();

或者说你想抛出一个异常

EasyMock.expectLastCall().andThrow()

如果您不在乎,则EasyMock.expectLastCall();不需要并且没有任何区别,您的陈述"obj.methodThatReturnsVoid(EasyMock.<String>anyObject());"足以建立期望。

于 2014-04-29T06:13:03.947 回答
1

您缺少 EasyMock.verify(..)

MyObject obj = EasyMock.createMock(MyObject.class);
MySomething something = EasyMock.createMock(MySomething.class);
EasyMock.expect(obj.methodThatReturnsSomething()).andReturn(something);

obj.methodThatReturnsVoid(EasyMock.<String>anyObject());

// whether I comment this out or not, it works
EasyMock.expectLastCall();

EasyMock.replay(obj);

// This method calls the obj.methodThatReturnsVoid()
someOtherObject.method(obj);

// verify that your method was called
EasyMock.verify(obj);
于 2016-08-16T20:45:41.303 回答