正如您引用的关于使用闭包而不是模拟的页面上所述,它们本身仅适用于模拟接口,并且仅当该接口具有单个方法时。因此,如果被测类没有使用接口,或者您需要模拟多个方法,则需要使用 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。