在Groovy中,什么时候使用Expando与'as'运算符和闭包有什么意义呢?

时间:2011-01-17 01:34:21

标签: unit-testing groovy closures expando expandometaclass

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

对于简单的情况,它们的使用看起来非常相似。

谢谢!

1 个答案:

答案 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。