2011-01-16 5 views
0

Warum funktioniert diese Unit-Test-Code-Zeile? groovy.sql.Sql hat keinen Argument-Konstruktor.Warum funktioniert diese Groovy MetaClass-Anweisung mit SQL-Klasse?

Sql.metaClass.constructor = { dataSource -> return new Sql(); } 

Diese Linie ist unter einigen anderen in einem Grails-app, die aus spottet ein SQL-Objekt Konstruktor und eine seiner Methoden. Es funktioniert großartig.

an der API für das Objekt Sql Sehen, ich sehe kein kein Argument Konstruktor: http://groovy.codehaus.org/api/groovy/sql/Sql.html

Dieser Stil den Konstruktor des überwiegenden Sql.metaClass.constructor verwendet, ist etwas, was ich zu Hause: http://manuel-palacio.blogspot.com/2010/07/groovy-tip-metaprogramming-1.html

Danke!

Antwort

1

groovy.sql.Sql hat keinen öffentlichen No-Args-Konstruktor, aber as can be seen in the source, es hat einen privaten No-Args-Konstruktor - ich denke, um die Syntax new Sql(connection: connection) zu unterstützen?.

Ich bin irgendwie überrascht, dass diese Technik zum Stubbing keine Ausnahme erzeugt, z. B. wenn sql.execute oder dergleichen ausgeführt wird.

+0

Schön! Danke für den bequemen Link zur Quelle auch! – finneycanhelp

+1

Anstatt den Konstruktor zu ändern, habe ich festgestellt, dass ich die DataSource in den Dienst einstellen kann. Die Implementierung der DataSource-Schnittstelle erfolgt einfach und klein über die "als DataSource". Siehe http://groovy.codehaus.org/Groovy+way+to+implement+interfaces, wo es "as X" heißt. – finneycanhelp

+0

Groovy 1.7 unterstützt auch anonyme innere Klassen. Arbeiten am besten mit einer neuen Version (z. B. 1.7.6). –

Verwandte Themen