(免责声明 - 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))。
编辑 - 我注意到,在附加调试器时,我几乎总是会收到这些错误,但从未附加调试器时。知道这可能有什么关系吗?
答案 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");