Как отмечалось на странице, на которую вы ссылались в отношении использования Closures вместо mocks, сами по себе они работают только для интерфейсов mocking и только в том случае, если этот интерфейс имеет единственный метод. Поэтому, если тестируемый класс не использует интерфейс или вам нужно смоделировать более одного метода, вам нужно использовать либо 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.