Jean T. Anderson wrote:
When I first starting working on the junit conversion for callable.java
(DERBY-2304) I had spotted the advice below in
http://wiki.apache.org/db-derby/KillDerbyTestHarness :

How to execute DDL at setUp that is dropped automatically at tearDown?

Provide a class that extends CleanDatabaseTestSetup and implement the 
decorateSQL method. This can be achieved as an inner class, search for 
references to CleanDatabaseTestSetup for examples.

 d) explicitly invokes a nested CleanDatabaseTestSetup, which creates
the decorateSQL method.
>  e) The decorateSQL method creates the database objects

To tie the quote from the wiki and d) together I think d) & e) could be reworded, though I think you know what is going on.

d) decorate your test with an (instance of an) anonymous inner class that extends CleanDatabaseTestSetup and implements a decorateSQL method that creates the database objects and populates any tables as required.

Just that your version could imply that the decorateSQL method is created by running the suite method (it isn't, the compiler does that) and that it's run by the suite method (use of invoke).

Of course that may not be clearer than the original on the wiki. :-)

3) The junit framework invokes that decorateSQL method

Technically true (and maybe false as well :-), but I think somewhat misleading.

JUnit is Object Oriented, test runners only knows about Tests, they just runs Tests, ie perform the "run action" of that Test. However, the test runners know nothing of what happens when these are run, they just make sure that the Test is run. This is one of the beauties of JUnit.

There are different types of Tests, the three typically used in Derby are fixtures, suites and decorators.

A fixture is an instance of a class and a public void method in that class. Its run action is to:
      1) call setUp() method
      2) call fixture method (e.g. testInsertStatement())
      3) call tearDown() method

A suite is just a list of other Tests (not just fixtures, but any type of Test). Its run action is to:
     1) for each Test in its list: perform the run action of that Test.

A decorator is an instance of a class and another Test (again any type of Test). Its run action is to:
      1) call its (the decorator's) setUp method
      2) perform the run action of its Test
      3) call its (the decorator's) tearDown method

(I guess it decorates the Test by adding "frills" around it?)

So to look at CleanDatabaseTestSetup we can see from its javadoc that its specific run action is:
  1a) clean the database
  1b) call decorateSQL (which does nothing)
  1c) call commit
  2) perform the run action of its Test
  3) clean the database

Now if I have an anonymous inner class that extends CleanDatabaseTestSetup and provides a decorateSQL method then its run action is:
  1a) clean the database
  1b) call decorateSQL which creates the required database state.
  1c) call commit
  2) perform the run action of its Test
  3) clean the database

So technically it is not JUnit that is calling decorateSQL, but instead CleanDatabaseTestSetup which is a decorator and thus just a Test.

HTH,
Dan.

Reply via email to