Spring2.5下单元测试(保证玩转)
网上看到不少Spring集成测试的文章,都是抄来抄去,看起来很高深,但是你按照他说的玩不转,缺乏实用性。
不玩虚的,我给篇实用的,Spring的测试框架好处就不说了,也没啥理论。呵呵!
测试目标:测试不依赖现有的数据库数据,测试不破坏现有的数据。
环境:
MySQL5(表为INNDB引擎)
Java 1.5
Spring 2.5.4
假设你已经具备上上述的环境,假设你写好了DAO实现,假设现在要测试DAO。
那么,你需要做的仅仅是:
1、配置好数据源。
<!--
配置系统的数据源 -->
< bean id ="dataSource" class ="org.apache.commons.dbcp.BasicDataSource" destroy-method ="close" >
< property name ="driverClassName" >
< value >${jdbc.driver} </ value >
</ property >
< property name ="url" >
< value >${jdbc.url} </ value >
</ property >
< property name ="username" >
< value >${jdbc.username} </ value >
</ property >
< property name ="password" >
< value >${jdbc.password} </ value >
</ property >
</ bean >
< bean id ="dataSource" class ="org.apache.commons.dbcp.BasicDataSource" destroy-method ="close" >
< property name ="driverClassName" >
< value >${jdbc.driver} </ value >
</ property >
< property name ="url" >
< value >${jdbc.url} </ value >
</ property >
< property name ="username" >
< value >${jdbc.username} </ value >
</ property >
< property name ="password" >
< value >${jdbc.password} </ value >
</ property >
</ bean >
2、配置好事务管理类。
<
bean
id
="transactionManager"
class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
< property name ="dataSource" ref ="dataSource" />
</ bean >
class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
< property name ="dataSource" ref ="dataSource" />
</ bean >
3、配置好DAO的Bean。
<
bean
id
="someDAO"
class
="org.lavasoft.test.SomeDAOImpl"
/>
4、写DAO的测试类,并继承AbstractTransactionalDataSourceSpringContextTests类,并且注入这个DAO实现,并写getConfigLocations()方法,然后写每个要测试的方法。
public
class TestSomeDAO
extends AbstractTransactionalDataSourceSpringContextTests {
//注入DAO
private SomeDAO someDAO;
public void setSomeDAO(SomeDAO someDAO) {
this.someDAO = someDAO;
}
//加载资源配置文件
@Override
public String[] getConfigLocations() {
return new String[]{ "ApplicationContext.xml", "ApplicationContext_xxx.xml"};
}
public void testSave() {
Some some = new Some();
some.setId(1L);
some.setname( "x");
someDAO.saveSome(some);
String sql = "select count(*) from t_some t where t.id=1";
int row = (Integer) jdbcTemplate.queryForObject(sql, Integer. class);
assertEquals(1, row);
}
public void testFindById() {
Some some = someDAO.findSomeById(1L);
System.out.println(some.getCode() + " " + some.getSomeKind());
assertNotNull(some);
}
public void testDeleteById() {
someDAO.deleteSomeById(1L);
String sql = "select count(*) from t_some t where t.code = 1";
int row = (Integer) jdbcTemplate.queryForObject(sql, Integer. class);
assertEquals(0, row);
}
}
//注入DAO
private SomeDAO someDAO;
public void setSomeDAO(SomeDAO someDAO) {
this.someDAO = someDAO;
}
//加载资源配置文件
@Override
public String[] getConfigLocations() {
return new String[]{ "ApplicationContext.xml", "ApplicationContext_xxx.xml"};
}
public void testSave() {
Some some = new Some();
some.setId(1L);
some.setname( "x");
someDAO.saveSome(some);
String sql = "select count(*) from t_some t where t.id=1";
int row = (Integer) jdbcTemplate.queryForObject(sql, Integer. class);
assertEquals(1, row);
}
public void testFindById() {
Some some = someDAO.findSomeById(1L);
System.out.println(some.getCode() + " " + some.getSomeKind());
assertNotNull(some);
}
public void testDeleteById() {
someDAO.deleteSomeById(1L);
String sql = "select count(*) from t_some t where t.code = 1";
int row = (Integer) jdbcTemplate.queryForObject(sql, Integer. class);
assertEquals(0, row);
}
}
经过以上四个步骤,你就实现了测试的目标,换做Service也一样行。