In Groovy, Quando ha senso utilizzare un Expando contro l'operatore 'come' e chiusure?
-
11-10-2019 - |
Domanda
Groovy è un linguaggio meraviglioso che offre un sacco di scelte diverse.
Nel pensare unit test, quando ha senso utilizzare un Expando oggetto rispetto al "come" operatore con chiusure?
http: //groovy.codehaus. org / Developer + test + con + Maps + e + + Expandos invece + di + Mocks vs http://groovy.codehaus.org/Developer+Testing+using + + Chiusure invece + di + Mocks
Per i casi semplici, il loro uso sembra così simile.
Grazie!
Soluzione
Come osservato sulla pagina si fa riferimento per quanto riguarda utilizzando chiusure invece che deride, da soli funzionano solo per le interfacce beffardo e solo se tale interfaccia ha un solo metodo. Quindi, se la classe in prova non utilizza un'interfaccia o avete bisogno di prendere in giro più di un singolo metodo è necessario utilizzare sia un Expando o mappa. Preferisco essere coerenti e sempre usare una mappa, il codice mi occupo di rado necessita di oggetti preso in giro con un unico metodo di interfaccia e l'utilizzo di una mappa che non richiede molte più combinazioni di tasti.
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)
Non che ci sia una differenza significativa tra l'uso di una mappa o Expando prendere in giro un oggetto, ma io preferisco una mappa solo per il bel modo è possibile dichiarare una mappa letterale e non c'è bisogno di nuovo di un Expando.