从附带调试器的EasyMock的“漂亮模拟”中获取异常

时间:2011-05-30 14:03:47

标签: java mocking easymock

(免责声明 - EasyMock newb)

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

但是,在第IllegalStateException("missing behavior definition for the preceding method")行的第foo.translate()行中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 ,以下代码段失败了。

{{1}}

任何人都可以解释这一点,或者告诉我如何使用EasyMock创建零冗长的存根(o(number_of_exercised_mock_methods))。

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

3 个答案:

答案 0 :(得分:3)

补充Jeff的答案。

来自EasyMock的方法createNiceMock javadoc:

  

创建一个模拟对象,该对象实现给定的接口,命令检查   默认情况下禁用,模拟对象将返回0,   对于意外调用,返回null或false。

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

  

处于记录状态(通话前)   重播),模拟对象没有   表现得像一个模拟对象,但它   记录方法调用。打电话后   重放,它的行为就像一个模拟对象,   检查是否有预期的方法   电话真的完成了。

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

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