【问题标题】:EasyMock number of "expected" calls is greater than the value set in "times" methodEasyMock 的“预期”调用次数大于“次”方法中设置的值
【发布时间】:2013-10-03 20:27:43
【问题描述】:

在重构一些旧的单元测试时,我添加了一个verify() 调用来查看一个方法被预期的次数,并且惊讶地发现“预期”调用大于使用times() 设置的调用。出于某种原因,下一行的期望调用被添加到我的方法中。

为什么会这样?

测试类

public class SandBoxTest {    
    @Test
    public void shouldGetSand() {
        Sand niceMock = EasyMock.createNiceMock(Sand.class);

        EasyMock.expect(niceMock.sandMethod()).andReturn(1).times(2);
        EasyMock.expect(Box.boxMethod()).andReturn(99).times(11);

        EasyMock.replay(niceMock);

        EasyMock.verify(niceMock);
    }
}

运行时输出

java.lang.AssertionError: 
  Expectation failure on verify:
    Sand.sandMethod(): expected: 13, actual: 0

预期的输出

java.lang.AssertionError: 
  Expectation failure on verify:
    Sand.sandMethod(): expected: 2, actual: 0

详情: EasyMock v3.1

跟进:使用 EasyMock 开启功能请求。 https://jira.codehaus.org/browse/EASYMOCK-128

【问题讨论】:

  • Box 是指sandBox,它是如何初始化的?
  • @SotiriosDelimanolis 不,sandBox 实际上是无关紧要的;我更新了代码以将其删除。此测试中没有具体的类或实现。

标签: java mocking easymock


【解决方案1】:

所以这是怎么回事。

The javadoc for expect() states

期望(T值) 返回当前线程中最后一次预期调用的预期设置器。

通过这些调用

EasyMock.expect(niceMock.sandMethod()).andReturn(1).times(2);
EasyMock.expect(Box.boxMethod()).andReturn(99).times(11);

在这两种情况下,最后一次预期调用是 niceMock.sandMethod(),因为它是唯一的 Mock 方法调用,所以它添加了 2+11 = 13

EasyMock 的模拟对象在代理中有一些计数器,用于注册被调用的内容。

Box.boxMethod() 只是一个静态方法调用。你不能嘲笑它。 Or maybe you can.

【讨论】:

  • 这很奇怪。我可以相信这是正在发生的事情,但我认为 javadoc 是......不容易理解。我还希望 EasyMock 会在期望调用静态方法时引发异常。
  • @Mike 尝试调用具有不同返回类型的静态方法。
  • java.lang.IllegalStateException: incompatible return value type 仍然更喜欢“不能模拟静态方法”的例外
  • @MikeRylander 我假设您的静态方法与您的sandMethod() 具有相同的返回类型,因此可以返回最后一个预期。我同意你的看法,目前还不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
相关资源
最近更新 更多