I summarized it from an appfuse project.
Section 1.
Any DAO test suit should inherit the object of AbstractTransactionalDataSourceSpringContextTests, which is used to test a data source.
There might be many DAO objects to be tested in a project. Those DAO objects share the same configuration. Therefore, the best way is to create a new an abstract class BaseDaoTestCase extends AbstractTransactionalDataSourceSpringContextTests. The method of getConfigLocations() must be implemented, which is to return a string array including the configuration files such as “applicationContext-hibernate.xml”, “applicationContext-resources.xml” and “applicationContext-service.xml”, etc. Those files can be used for many sub DAO test suits. Here is an example of BaseDaoTestCase:
package
com.pplus.test.dao;
import
java.util.Enumeration;
import
java.util.HashMap;
import
java.util.Map;
import
java.util.MissingResourceException;
import
java.util.ResourceBundle;
import
org.apache.commons.beanutils.BeanUtils;
import
org.apache.commons.logging.Log;
import
org.apache.commons.logging.LogFactory;
import
org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
/**
*
Base
class
for
running
Dao
tests.
*
@author
mraible
*/
public
abstract
class
BaseDaoTestCase
extends
AbstractTransactionalDataSourceSpringContextTests {
protected
final
Log
log
= LogFactory.getLog(getClass());
protected
ResourceBundle
rb
;
protected
String[] getConfigLocations() {
setAutowireMode(
AUTOWIRE_BY_NAME
);
String dir=
"file:D:/yin/CN2.0/CN21/WEB-INF/"
;
//*
return
new
String [] {dir+
"applicationContext-hibernate.xml"
,
dir+
"applicationContext-resources.xml"
,
dir+
"applicationContext-service.xml"
};
//*/
}
public
BaseDaoTestCase() {
// Since a ResourceBundle is not required for each class, just
// do a simple check to see if one exists
String className =
this
.getClass().getName();
try
{
rb
= ResourceBundle.getBundle(className);
}
catch
(MissingResourceException mre) {
//log.warn("No resource bundle found for: " + className);
}
}
/**
*
Utility
method
to
populate
a
javabean
-
style
object
with
values
*
from
a
Properties
file
*
@param
obj
*
@return
Object
populated
object
*
@throws
Exception
*/
protected
Object populate(Object obj)
throws
Exception {
// loop through all the beans methods and set its properties from
// its .properties file
Map map =
new
HashMap();
for
(Enumeration keys =
rb
.getKeys(); keys.hasMoreElements();) {
String key = (String) keys.nextElement();
map.put(key,
rb
.getString(key));
}
BeanUtils.copyProperties(obj, map);
return
obj;
}
}
Section 2.
Creates a TestCase inherits BaseDaoTestCase. Generally, it includes two attributes: an object dao to be tested and an value object which reflects the key fields of the module object. We must innovate the setter of dao. Here is an example:
package com.pplus.test.dao;
import java.util.List;
import javax.sql.DataSource;
import com.pplus.dao.TcnrDriverDao;
import com.pplus.model.TcnrDriver;
import org.springframework.orm.ObjectRetrievalFailureException;
public class TcnrDriverDaoTest extends BaseDaoTestCase {
private Integer tcnrDriverId = new Integer("1");
private TcnrDriverDao dao = null;
public void setTcnrDriverDao(TcnrDriverDao dao) {
this.dao = dao;
}
public void testAddTcnrDriver() throws Exception {
TcnrDriver tcnrDriver = new TcnrDriver();
// set required fields
dao.saveTcnrDriver(tcnrDriver);
// verify a primary key was assigned
assertNotNull(tcnrDriver.getDriverid());
// verify set fields are same after save
}
public void testGetTcnrDriver() throws Exception {
TcnrDriver tcnrDriver = dao.getTcnrDriver(tcnrDriverId);
assertNotNull(tcnrDriver);
}
public void testGetTcnrDrivers() throws Exception {
TcnrDriver tcnrDriver = new TcnrDriver();
List results = dao.getTcnrDrivers(tcnrDriver);
assertTrue(results.size() > 0);
}
public void testSaveTcnrDriver() throws Exception {
TcnrDriver tcnrDriver = dao.getTcnrDriver(tcnrDriverId);
// update required fields
dao.saveTcnrDriver(tcnrDriver);
}
public void testRemoveTcnrDriver() throws Exception {
Integer removeId = new Integer("3");
dao.removeTcnrDriver(removeId);
try {
dao.getTcnrDriver(removeId);
fail("tcnrDriver found in database");
} catch (ObjectRetrievalFailureException e) {
assertNotNull(e.getMessage());
}
}
}