2011-01-17 14 views
3

Groovy ist eine wunderbare Sprache, die viele verschiedene Möglichkeiten bietet.In Groovy, wann macht es Sinn, einen Expando gegen den Operator 'as' und Closures zu verwenden?

Wenn Sie über Komponententests nachdenken, wann ist es sinnvoll, ein Expando Objekt gegen den "as" Operator mit Verschlüssen zu verwenden?

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

Für einfache Fälle, scheint ihre Verwendung so ähnlich.

Danke!

+0

Das System unter Test (SUT) hat Abhängigkeiten. Wir kopieren eine Abhängigkeit häufig mithilfe einer Map und geben sie dann mit dem Operator "as" ein. Wie im Artikel "Entwickler testen mit Closures anstelle von Mocks" beschrieben, verwenden wir eine "Karte der Schließungen mit dem verwendeten Schlüssel ist der gleiche Name wie die Methoden der Schnittstelle" In diesem Fall ist die "Schnittstelle" die API des Abhängigkeit; es ist eine groovy/java Klasse und keine groovy/java Schnittstelle. – finneycanhelp

Antwort

4

Wie auf der von Ihnen referenzierten Seite zur Verwendung von Closures anstelle von Mocks erwähnt, funktionieren sie nur für das Mocking von Interfaces und nur dann, wenn dieses Interface eine einzige Methode hat. Wenn also die zu testende Klasse keine Schnittstelle verwendet oder Sie mehr als nur eine Methode vortäuschen müssen, müssen Sie entweder Expando oder Map verwenden. Ich bevorzuge es, konsistent zu sein und immer eine Map zu verwenden. Der Code, mit dem ich mich beschäftige, benötigt selten Objekte, die mit einer einzigen Schnittstellenmethode gespottet werden, und die Verwendung einer Map erfordert nicht viel mehr Tastenanschläge.

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) 

nicht sicher, dass es einen signifikanten Unterschied eine Karte oder Expando zwischen der Verwendung eines Objekts zu verspotten, aber ich ziehe eine Karte nur wegen der schönen Art und Weise Sie eine Karte wörtlichen und nicht müssen neu auf einer Expando erklären kann .

+0

Danke für die netten Codebeispiele! – finneycanhelp