В Groovy, когда имеет смысл использовать Expando против оператора "как" и замыканий?

Groovy - это замечательный язык, который предлагает много разных вариантов.

Размышляя о модульных тестах, когда имеет смысл использовать объект Expando вместо оператора "как" с замыканиями?

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 ответ

Решение

Как отмечалось на странице, на которую вы ссылались в отношении использования 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.

Другие вопросы по тегам