В Groovy, когда имеет смысл использовать Expando против оператора «как» и замыканий? - PullRequest
3 голосов
/ 17 января 2011

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

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

http://groovy.codehaus.org/Developer+Testing+using+Maps+and+Expandos+instead+of+Mocks против http://groovy.codehaus.org/Developer+Testing+using+Closures+instead+of+Mocks

Для простых случаев их использование выглядит очень похоже.

Спасибо!

1 Ответ

4 голосов
/ 17 января 2011

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

...