Tips for using DBUnit and TestNG in seam-gen generated project (Seam 2.2.0.GA)
alartin Aug 17, 2010 10:20 PMAfter struggling for a while, I finally got DBUnit and TestNG work with my seam-gen generated project. I use Seam 2.2.0.GA and there are some tips or workrounds, so I list them here for other guys who still suffer from it.
First, you need to modify the puJndiName in components-test.properties:
Change
# These properties are used to replace Ant-style tokens in the component descriptor (components.xml) at runtime.
jndiPattern=#{ejbName}/local
debug=true
seamBootstrapsPu=true
seamEmfRef=#{entityManagerFactory}
puJndiName=#{null}To
# These properties are used to replace Ant-style tokens in the component descriptor (components.xml) at runtime.
jndiPattern=#{ejbName}/local
debug=true
seamBootstrapsPu=true
seamEmfRef=#{entityManagerFactory}
puJndiName=java:/xxxEntityManagerFactoryWhere xxx is your project name. I think this is a seam-gen bug, it puts a null in the expression.
Second, create a XxxTest.xml under test dir where Xxx is your entity, for example Person.
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="PersonTestSuite" verbose="2" parallel="false"> <test name="PersonTest"> <parameter name="datasourceJndiName" value="java:/DefaultDS"/> <parameter name="database" value="HSQL" /> <classes> <class name="com.mydomain.demoproject.test.PersonTest" /> </classes> </test> </suite>
Note, since the data source in the persistence-test.xml is the DefaultDS, we must use same value here.
Third, create a flat xml data file for DBUnit, say, BaseData.xml under test dir:
<?xml version="1.0" encoding="UTF-8"?> <dataset> <PERSON id="1" version="1" name="A" /> <PERSON id="2" version="1" name="B" /> <PERSON id="3" version="1" name="C" /> </dataset>
Fourth, create XXXTest.java, say PersonTest.java:
public class PersonTest extends DBUnitSeamTest {
@Override
protected void prepareDBUnitOperations() {
beforeTestOperations.add(new DataSetOperation("BaseData.xml"));
}
@Test
public void testPersonList() throws Exception {
new NonFacesRequest("/PersonList.xhtml") {
@Override
protected void renderResponse() throws Exception {
List persons = (List)getValue("#{personList.resultList}");
Iterator itr = persons.iterator();
while(itr.hasNext()) {
Person person = (Person)itr.next();
System.out.println(person.getId()+":"+person.getName());
}
}
}.run();
}
}Note, you should care about the path of DataSetOperation. There is a bug in the seam-gen's build.xml, it will not copy the BaseData.xml to the test-build. We will fix it in the next step.
Fifth, modify the buildtest target in the build.xml:
Change
<copy todir="${test.dir}" flatten="true">
<fileset dir="${src.test.dir}">
name="**/*Test.xml"/>
</fileset>
</copy>To
<copy todir="${test.dir}" flatten="true">
<fileset dir="${src.test.dir}">
<include name="**/*.xml"/>
</fileset>
</copy>Note, this will copy any xml file to test-build, in this case, BaseData.xml
Sixth, run the test, and you will get:
1:A 2:B 3:C PASSED: testPersonList
Now, you can list the person data in the DBUnit plat xml file using TestNG test. You can see BaseData.xml is copied to test-build dir with PersonTest.xml file.
Conclusion:
- Pay attention to components-test.properties, persistence-test.xml, there is some exception about jndi name related to this kind of configuration
- Pay attention to build.xml, sometimes it will ignore your configuration file
- Pay attention to resource path in your test code, otherwise DBUnit will throw exceptions like org.dbunit.dataset.DataSetException: java.net.MalformedURLException