On 2015-07-02 12:00 , Richard Heintze wrote:
I love this example and it even works!

https://gist.github.com/kiy0taka/272110

Can someone help me understand the syntax on lines 29-33?
(1) What is dataset? Are we passing it a lambda?


That dataSet is a call to the method defined at the bottom of DbUnitSampleTest, and we are passing it a Closure (like a lambda). Parentheses are not required for unambiguous method calls in Groovy, and conventionally not used around a Closure when passing it as the last parameter.

OK, so semi-colons are optional. Hmmm... Apparently we have a list of emp constructors. Is this correct?


Actually, those emp are method calls, too, passing a Map as the single parameter. The parentheses and brackets are both optional there. There is no emp class. This is Groovy's builder pattern.

(2) How is it that the "{}" are constructing a list of emps?

Why is there no code like "[emp empno:7369, ename:'SMITH', job:'CLERK'
emp empno:7499, ename:'ALLEN', job:'SALESMAN'
emp empno:7521, ename:'WARD', job:'SALESMAN'] as List"?


That Closure, c, is passed by the dataSet method to StreamingMarkupBuilder's bind method, wrapped in another Closure to add a "dataset" root element. The bind method uses a BaseMarkupBuilder to call the Closure and create XML. The emp method doesn't exist, so each time the Closure tries to call it, the builder uses Groovy's invokeMethod to add another element to the XML.

(3) And what about emp? Who defines the class emp and its constructor? Where?


DbUnit just needs the XML to match the db schema that was created in the static block. There are no domain classes in that example.

(4) And what is this business with the grape.grab inside the static {}? I've never seen the keyword static in groovy code before. Why static? Why not "@Grab" instead of grapes.grab (inside the static)?


I'm not sure about that, but would guess that it's an hsqldb convention, and @Grab might work too.

Thanks
siegfried

Cheers,
11011011

Reply via email to