Groovy是一种很棒的语言,提供了许多不同的选择。
在考虑单元测试时,何时使用Expando是有意义的 对象与带有闭包的“as”运算符?
http://groovy.codehaus.org/Developer+Testing+using+Maps+and+Expandos+instead+of+Mocks VS http://groovy.codehaus.org/Developer+Testing+using+Closures+instead+of+Mocks
对于简单的情况,它们的使用看起来非常相似。
谢谢!
答案 0 :(得分:4)
如您所引用的关于使用Closures而非mocks的页面所述,它们本身仅适用于模拟接口,并且仅在该接口具有单个方法时才有效。因此,如果被测试的类没有使用接口,或者您需要模拟多个方法,则需要使用Expando或Map。我更喜欢保持一致并始终使用Map,我处理的代码很少需要使用单个接口方法模拟的对象,并且使用Map不需要更多的击键。
interface Foo {
def someMethod(s)
}
// Closure, this breaks if someOtherMethod() is added to Foo or if Foo is a class
def mockMethod = { arg -> ...}
def myTestObject = new ObjectUnderTest(mockMetod as Foo)
// Map
def mockMethod = { arg -> ...}
def myTestObject = new ObjectUnderTest([someMethod:mockMethod] as Foo)
不确定使用Map或Expando来模拟对象之间存在显着差异,但我更喜欢Map,因为你可以通过很好的方式声明Map文字而不必新建一个Expando。