【问题标题】:Getting exception from EasyMock's "nice mock" with a debugger attached从 EasyMock 的“nice mock”中获取异常并附加调试器
【发布时间】:2011-05-30 14:03:46
【问题描述】:

(免责声明 - EasyMock newb)

根据文档(和this post),如果我想使用EasyMock 生成存根对象,我应该使用EasyMock.createNiceMock()。 “nice mock”实际上是一个存根——即一个不参与验证的对象,只是返回值。

但是,下面的 sn-p 对我来说失败了,在第二行 foo.translate() 上出现了 IllegalStateException("missing behavior definition for the preceding method")

Foo foo = EasyMock.createNiceMock(Foo.class);
EasyMock.replay(foo); // added this line
foo.translate("a", "b");
foo.translate("a", "b"); // only the second calls throws an exception

谁能解释一下,或者更确切地说,告诉我如何使用 EasyMock 创建具有零详细度的存根 (o(number_of_exercised_mock_methods))。

编辑 - 我注意到我几乎总是在附加调试器时遇到这些错误,但在未附加调试器时从来没有。知道这有什么关系吗?

【问题讨论】:

    标签: java mocking easymock


    【解决方案1】:

    补充 Jeff 的回答。

    来自 EasyMock 的方法 createNiceMock javadoc:

    创建一个实现给定接口的模拟对象,订单检查 默认禁用,模拟对象将返回0, 意外调用为 null 或 false。

    由此方法创建的模拟对象不需要任何配置(预期调用)。您只需要创建它并“重放它”。示例:

    ComplicatedObject stub = EasyMock.createNiceMock();
    replay(stub);
    

    在创建的存根上允许任何方法调用(它不会抛出异常),并且它们将始终返回默认值(0、null 或 false)。如果你设置了一个特定的调用期望,那么你必须配置它的返回值,否则你会得到一个错误(这是你的情况)。

    如果你想限制可以执行的方法(如果调用了意外的方法,则使测试失败),恐怕你必须创建一个常规的模拟,设置每个调用期望和一个返回值对于每一个。

    【讨论】:

      【解决方案2】:

      如果你的翻译方法返回一个值,你需要为它设置一个期望。

      expect(foo.translate("a","b")).andStubReturn(retVal);
      

      【讨论】:

      • Nice Mock 不应该让我不设定期望吗?这意味着如果执行了 k 个方法,我需要设置 k 个期望……在这种情况下,我对期望完全不感兴趣,我只想反对工作。
      • 我相信只处理模拟的验证而不是设置。您是否尝试添加返回值并查看它是否有效?此外,如果您不关心期望值而只需要一个虚拟对象,那么为什么还要设置期望值,只需创建一个漂亮的模拟并将其置于重放模式即可。
      • "添加返回值..." - 这需要为所有方法设置期望值,我试图避免这种情况。我根本不想设定期望。我相信即使我在第一行之后调用 replay() 上述调用也会失败(我会在下次工作时尝试一下)。
      • 哦,我在你的代码中遗漏了一些东西。您实际上并没有创建一个好的模拟,而是使用 EasyMock.createMock 创建了一个标准模拟。使用 EasyMock.createNiceMock 创建一个漂亮的模拟。
      • 是的,我已经确认您需要添加andStubReturn(或andReturn)。如果您希望该方法返回默认值(即 false、0 等),则根本不要设置任何期望值,例如: Foo foo = createNiceMock(Foo.class);重播(富);否则,您需要为返回它们的方法添加返回值。
      【解决方案3】:

      您需要致电EasyMock.replay(foo)。在您这样做之前,您的模拟对象处于“记录状态”。来自 EasyMock 文档:

      在记录状态(调用前 重播),模拟对象不 表现得像一个模拟对象,但它 记录方法调用。打电话后 重放,它的行为就像一个模拟对象, 检查是否符合预期的方法 通话真的结束了。

      如果您要创建存根对象,只需调用 createNiceMock 后跟 replay

      Foo foo = EasyMock.createNiceMock(Foo.class);
      EasyMock.replay(foo);
      foo.translate("a", "b");
      foo.translate("a", "b");
      

      【讨论】:

        猜你喜欢
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        相关资源
        最近更新 更多