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也一样行。