Tools

Coarse-Grained Unit Testing

Using OpenEJB and DBUnit to write repeatable unit tests for Java components

The Test

As for the unit test itself, I wrote a base class DataDependantEJBTestCase that helps initialize OpenEJB with the data source during setup as shown below.

As you might have noticed, the inclusion filter (like that above) can load specific objects. This feature is useful in large projects with lot of EJBs because it cuts down load time. Just the necessary EJBs required for each specific test can be loaded using this feature. This setup method also creates and stores the handle to context object and data helper for the subclasses to use. All unit tests can extend this base class to perform the setup.

TicketBookerTest is the test class for ticket booking session EJB. It extends DataDependantEJBTestCase and calls its setup method to initialize as shown below:

It also gets handle to EJB using obtained using JNDI lookup. The key thing to note here is that it prepares the database using seed data stored in XML file by invoking data helper. This is the critical step to create repeatable data dependant test. It does it with the help of the Ticket_Seed DBUnit XML data file which contains ticket data as shown below:

That's all there to it for setup. Now let's take a look at individual test methods and how the setup helps it.

The first method tests the booking logic as shown below:

Since the setup method cleans up existing data everytime before running the test, it should always succeed as long as the implementation is correct.

The second method tests the branch of booking code that is supposed to validate and throw an error message if the data already exists:

Since the booking data of Pakkirisamy is always seeded in the setup for that destination as mentioned in the XML, this test should always pass as long as it throws validation exception correctly.

The next method tests if the seat availability checking method correctly returns True as shown below:

Since the setup cleans up existing data, this also should always pass as long as the logic is implemented correctly by the session bean.

The final method tests if the seat availability checking method correctly returns False:

Since we inserted five bookings from Marudhur to Mars using the XML file, this should always return False if the logic is implemented correctly.

All of these tests can run independent of application server and within your IDE. So developing, debugging, and testing become less time consuming and less painful.

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task.
However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

Video

This month's Dr. Dobb's Journal

This month,
Dr. Dobb's Journal is devoted to mobile programming. We introduce you to Apple's new Swift programming language, discuss the perils of being the third-most-popular mobile platform, revisit SQLite on Android
, and much more!