35.3.3. Integration Testing with Mock Data
To insert or clean data in your database before each test, you can use Seam's integration with DBUnit. To do this, extend DBUnitSeamTest rather than
SeamTest
.
You must provide a dataset for DBUnit.
DBUnit supports two formats for dataset files, flat and XML. Seam's DBUnitSeamTest assumes that you use the flat format, so make sure that your dataset is in this format.
<dataset> <ARTIST id="1" dtype="Band" name="Pink Floyd" /> <DISC id="1" name="Dark Side of the Moon" artist_id="1" /> </dataset>
In your test class, configure your dataset by overriding
prepareDBUnitOperations()
as follows:
protected void prepareDBUnitOperations() { beforeTestOperations.add( new DataSetOperation("my/datasets/BaseData.xml") ); }
DataSetOperation
defaults to DatabaseOperation.CLEAN_INSERT
if no other operation is specified as a constructor argument. The previous example cleans all tables defined BaseData.xml
, then inserts all rows declared in BaseData.xml
before each @Test
method is invoked.
If you require extra cleanup after a test method executes, add operations to the
afterTestOperations
list.
You need to tell DBUnit about your datasource by setting a TestNG test parameter named
datasourceJndiName
:
<parameter name="datasourceJndiName" value="java:/seamdiscsDatasource"/>
DBUnitSeamTest supports both MySQL and HSQL. You must tell it which database is being used, otherwise it defaults to HSQL:
<parameter name="database" value="MYSQL" />
It also allows you to insert binary data into the test data set. (Note that this is untested on Windows.) Tell DBUnitSeamTest where to find these resources on your classpath:
<parameter name="binaryDir" value="images/" />
You do not have to configure any of these parameters if you use HSQL and have no binary imports. However, unless you specify
datasourceJndiName
in your test configuration, you will have to call setDatabaseJndiName()
before your test runs. If you are not using HSQL or MySQL, you need to override some methods. See the Javadoc of DBUnitSeamTest
for more details.