Concordion is a framework to support Behaviour Driven Design. It is based on JUnit to run tests and HTML enriched with a little Concordion syntax to call fixture methods and make assertions on test outcome. I won’t describe Concordion because it is well documented here: https://concordion.org/.
Instead I’ll describe a small utility class I’ve created to avoid code duplication. Concordion requires a JUnit class for each test. The utility I’ll describe below allows you to run all Concordion tests without having a utility class for each test.
In Concordion you specify test cases and expected outcomes in a HTML file. Each HTML file is accompanied by a Java class of the same name that has the b>@RunWith(ConcordionRunner.class</b annotation. This Java class is comparable with Fitnesse’s fixture classes. Here you can create methods that are used in the HTML file to connect the test case to the business code.
In my particular use case the team ended up writing lots of mostly empty Java files. The system under test was processing XML message files, so all the test needed to do was call a single method to hand the XML to the business code and then validate results. Each Java class was basically the same, except for its name.
To avoid this duplication I created a class that uses the JavaAssist library to generate a Java class on the fly and run it as a JUnit test. You can find my code on Github:
git clone firstname.lastname@example.org:jvermeir/concordionDemo
ConcordionRunner generates a class using a template. The template can be really simple like in my example where FixtureTemplate extends MyFixture. MyFixture holds all fixture code to connect the test to the application under test. This is where we would put all fixture code necessary to call a service using a XML message. In the example there’s just the single getGreeting() method.
HelloWorldAgain.html is the actual Concordion test. It shows the call to getGreeting(), which is a method of MyFixture.
The dependencies are like this:
FixtureTemplate <b>extends</b> MyFixtureThe example in Example.java shows how to use ConcordionRunner to execute a test. This could easily be extended to recursively go through a directory and execute all tests found. Note that Example writes the generated class to a file. This may help in troubleshooting but isn’t really necessary.
YourTest.html <b>uses</b> Concordion
Example <b>uses</b> ConcordionRunner <b>uses</b> JUnitCore
Now it would be nice to adapt the Eclipse plugin to allow you to right click the HTML file and run it as a Concordion test without adding a unit test.