2011-09-20 72 views
4

是什么这之间的区别:EasyMock.expect(...)。times(...)与使用EasyMock.expect(...)几次之间的区别?

ResultSet set = EasyMock.createNiceMock(ResultSet.class); 
EasyMock.expect(set.getInt("col1")).andReturn(1); 
EasyMock.expect(set.wasNull()).andReturn(false); 
EasyMock.expect(set.getInt("col2")).andReturn(2); 
EasyMock.expect(set.wasNull()).andReturn(false); 
EasyMock.replay(set); 

assertEquals(1, set.getInt("col1")); 
assertEquals(false, set.wasNull()); 
assertEquals(2, set.getInt("col2")); 
assertEquals(false, set.wasNull()); 

这:

ResultSet set = EasyMock.createNiceMock(ResultSet.class); 
EasyMock.expect(set.getInt("col1")).andReturn(1); 
EasyMock.expect(set.getInt("col2")).andReturn(2); 
EasyMock.expect(set.wasNull()).andReturn(false).times(2); 
EasyMock.replay(set); 

assertEquals(1, set.getInt("col1")); 
assertEquals(false, set.wasNull()); 
assertEquals(2, set.getInt("col2")); 
assertEquals(false, set.wasNull()); 

注意:这两组代码都是作为jUnit测试编译和运行成功的。另外请注意,这里使用的是一个“很好”的模拟。

回答

8

要回答标题中的问题 - 没有区别。调用x.expect(y).times(3)是完全一样的调用

x.expect(y); 
x.expect(y); 
x.expect(y); 

(请注意,由安迪·托马斯 - 克拉默指出,您的具体的例子并不完全等效的,因为调用的顺序不同。)

这也可能只是看起来像一个方便的问题。然而,除此之外还有一个明显的区别:在times()的情况下,您可以将预期的呼叫次数作为变量传递。因此,您可以通过某个外部文件进行配置,或者通过公共常量int进行配置,您也可以使用它来启动测试工具。它比明确编译expect()的正确呼叫次数更灵活(如果您现在需要使用5个工作人员而不是3个测试人员,则更新您的代码)。

3

第二个更容易读写。然而,如果模拟被改为严格的模拟,那么它会失败,按照哪种顺序进行验证。

+0

所以你基本上说没有区别,真的吗?我知道如果它改为严格,那就很重要。 – daveslab

+1

成功的验证方面没有什么区别,因为一个很好的模拟 - 但是,可读性/可写性方面的差异。考虑时间(42)。正如@Andrzej指出的那样,有时您可能希望调用的数量是一个变量。 –

相关问题