使用spring-mock進行dao集成測試
在進行dao的集成測試時候,數(shù)據(jù)清理,察看數(shù)據(jù)都是比較麻煩的事情,使用Spring-mock.jar可以幫助我們簡化著一個過程。我舉一個簡單的例子,說明一下如何使用spring-mock。
首先是po, hbm.xml, dao, daoimpl沒什么好說的:
然后測試的基類SpringDAOTestCase繼承自AbstractTransactionalDataSourceSpringContextTests,目前只有一個指定測試用xml文件位置的邏輯。
接著是我們真正測試的類CustomerDAOTest.java:
最后看看配置文件test.xml:
這個文件很簡單,不要忘記transactionManager的配置,Test類會自動裝配的。
運行之后,就可以看到應(yīng)有的結(jié)果,并且數(shù)據(jù)庫中不會有數(shù)據(jù)污染。這個過程主要是開始一個transaction,然后開始你的test方法,執(zhí)行dao操作,執(zhí)行sql查詢驗證結(jié)果,最后無論成功失敗rollback transaction。
首先是po, hbm.xml, dao, daoimpl沒什么好說的:
java代碼:? |
Customer.java : package rst.spring.mock; import java.io.Serializable; /** @author Hibernate CodeGenerator */ publicclass Customer implementsSerializable{ ? ? /** identifier field */ ? ? privateLong id; ? ? /** nullable persistent field */ ? ? privateString name; ? ? /** full constructor */ ? ? public Customer(String name){ ? ? ? ? this.name = name; ? ? } ? ? /** default constructor */ ? ? public Customer(){ ? ? } ? ? publicLong getId(){ ? ? ? ? return this.id; ? ? } ? ? publicvoid setId(Long id){ ? ? ? ? this.id = id; ? ? } ? ? publicString getName(){ ? ? ? ? return this.name; ? ? } ? ? publicvoid setName(String name){ ? ? ? ? this.name = name; ? ? } } Customer.hbm.xml : <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC ? ? ? ? "-//Hibernate/Hibernate Mapping DTD//EN" ? ? ? ? "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping package="rst.spring.mock"> ? ? ? ? <class name="Customer" table="customer"> ? ? ? ? ? ? ? ? <id name="id" column="id" type="long" unsaved-value="null"> ? ? ? ? ? ? ? ? ? ? ? ? <generator class="identity"/> ? ? ? ? ? ? ? ? </id> ? ? ? ? ? ? ? ? <property name="name" column="name" type="string"/> ? ? ? ? </class> </hibernate-mapping> CustomerDAO : /* * Created on 2005-3-25 */ package rst.spring.mock; import org.springframework.dao.DataAccessException; /** * @author rst * */ publicinterface CustomerDAO { ? ? publicvoid add(Customer customer)throws DataAccessException; } CustomerDAOImpl : package rst.spring.mock; import org.springframework.dao.DataAccessException; import org.springframework.orm.hibernate.support.HibernateDaoSupport; /** * Class description. * * @author rst */ publicclass CustomerDAOHibernateImpl extends HibernateDaoSupport implements CustomerDAO{ ? ? ? ? publicvoid add(Customer customer)throws DataAccessException{ ? ? ? ? this.getHibernateTemplate().save(customer); ? ? } } |
然后測試的基類SpringDAOTestCase繼承自AbstractTransactionalDataSourceSpringContextTests,目前只有一個指定測試用xml文件位置的邏輯。
java代碼:? |
package rst.spring.mock; import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests; /** * Class description. * * @author rst */ publicabstractclass SpringDAOTestCase extends AbstractTransactionalDataSourceSpringContextTests { ? protectedString[] getConfigLocations(){ ? ? returnnewString[]{ "test.xml" }; ? } } |
接著是我們真正測試的類CustomerDAOTest.java:
java代碼:? |
package rst.spring.mock; /** * Class description. * * @author rst */ publicclass CustomerDaoTest extends SpringDAOTestCase { ? ? private CustomerDAOHibernateImpl customerDAO; ? ? protectedvoid onSetUpInTransaction()throwsException{ ? ? ? ? super.onSetUpInTransaction(); ? ? ? ? //this.setPopulateProtectedVariables(true); ? ? ? ? customerDAO = (CustomerDAOHibernateImpl) this.applicationContext.getBean("customerDAO"); ? ? } ? ? protectedvoid onTearDownInTransaction(){ ? ? ? ? customerDAO = null; ? ? } ? ? publicvoid testInsert(){ ? ? ? ? Customer customer = new Customer(); ? ? ? ? customer.setName("javaeye"); ? ? ? ? customerDAO.add(customer); ? ? ? ? String name = (String) jdbcTemplate.queryForObject("select name from customer where id=?", newObject[]{customer.getId()}, String.class); ? ? ? ? ? ? ? ? assertEquals(customer.getName(), name); ? ? } } |
最后看看配置文件test.xml:
java代碼:? |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <!-- ? - Application context definition for Petclinic on Hibernate. ? ? ? ? --> <beans> ? ? ? ? <!-- ========================= RESOURCE DEFINITIONS ========================= --> ? ? ? ? ? <!-- Configurer that replaces ${...} placeholders with values from a properties file --> ? ? ? ? <!-- (in this case, JDBC-related settings for the dataSource definition below) --> ? ? ? ? <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> ? ? ? ? ? ? ? ? <property name="location"><value>classpath:jdbc.properties</value></property> ? ? ? ? </bean> ? ? ? ? <!-- Local DataSource that works in any environment --> ? ? ? ? <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> ? ? ? ? ? ? ? ? <property name="driverClassName"><value>${jdbc.driverClassName}</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> ? ? ? ? <!-- Hibernate SessionFactory --> ? ? ? ? <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> ? ? ? ? ? ? ? ? <property name="dataSource"><ref local="dataSource"/></property> ? ? ? ? ? ? ? ? <property name="mappingResources"> ? ? ? ? ? ? ? ? ? ? ? ? <value>rst/spring/mock/Customer.hbm.xml</value> ? ? ? ? ? ? ? ? </property> ? ? ? ? ? ? ? ? <property name="hibernateProperties"> ? ? ? ? ? ? ? ? ? ? ? ? <props> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <prop key="hibernate.dialect">${hibernate.dialect}</prop> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <prop key="hibernate.show_sql">true</prop> ? ? ? ? ? ? ? ? ? ? ? ? </props> ? ? ? ? ? ? ? ? </property> ? ? ? ? </bean> ? ? ? ? <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> ? ? ? ? <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> ? ? ? ? ? ? ? ? <property name="sessionFactory"><ref local="sessionFactory"/></property> ? ? ? ? </bean> ? ? ? ? ? ? ? ? <bean id="hibernateTemplate" class="org.springframework.orm.hibernate.HibernateTemplate"> ? ? ? ? ? ? ? ? <property name="sessionFactory"><ref local="sessionFactory"/></property> ? ? ? ? </bean> ? ? ? ? <bean id="customerDAO" class="rst.spring.mock.CustomerDAOHibernateImpl"> ? ? ? ? ? ? ? ? <property name="hibernateTemplate"><ref local="hibernateTemplate"/></property> ? ? ? ? </bean> </beans> |
這個文件很簡單,不要忘記transactionManager的配置,Test類會自動裝配的。
運行之后,就可以看到應(yīng)有的結(jié)果,并且數(shù)據(jù)庫中不會有數(shù)據(jù)污染。這個過程主要是開始一個transaction,然后開始你的test方法,執(zhí)行dao操作,執(zhí)行sql查詢驗證結(jié)果,最后無論成功失敗rollback transaction。
posted on 2006-06-21 12:41 風(fēng)人園 閱讀(654) 評論(0) 編輯 收藏 所屬分類: Spring