kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks

          http://rongsantang.yculblog.com/post.621226.html

          使用spring-mock進行dao集成測試

          一地雞毛 @ 2005-03-25 16:19

          在進行dao的集成測試時候,數(shù)據(jù)清理,察看數(shù)據(jù)都是比較麻煩的事情,使用Spring-mock.jar可以幫助我們簡化著一個過程。我舉一個簡單的例子,說明一下如何使用spring-mock。

          首先是po, hbm.xml, dao, daoimpl沒什么好說的:

          Customer.java :

          package rst.spring.mock;

          import java.io.Serializable;

          /** @author Hibernate CodeGenerator */
          public class Customer implements Serializable {

             /** identifier field */
             private Long id;

             /** nullable persistent field */
             private String name;

             /** full constructor */
             public Customer(String name) {
                 this.name = name;
             }

             /** default constructor */
             public Customer() {
             }

             public Long getId() {
                 return this.id;
             }

             public void setId(Long id) {
                 this.id = id;
             }

             public String getName() {
                 return this.name;
             }

             public void 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
          *
          */
          public interface CustomerDAO {
             public void 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
          */
          public class CustomerDAOHibernateImpl extends HibernateDaoSupport implements CustomerDAO{
             
             public void add(Customer customer) throws DataAccessException{
                 this.getHibernateTemplate().save(customer);
             }
          }



          然后測試的基類SpringDAOTestCase繼承自AbstractTransactionalDataSourceSpringContextTests,目前只有一個指定測試用xml文件位置的邏輯。

          package rst.spring.mock;

          import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

          /**
          * Class description.
          *
          * @author rst
          */
          public abstract class SpringDAOTestCase extends AbstractTransactionalDataSourceSpringContextTests {

           protected String[] getConfigLocations() {
             return new String[] { "test.xml" };
           }

          }


          接著是我們真正測試的類CustomerDAOTest.java:

          package rst.spring.mock;

          /**
          * Class description.
          *
          * @author rst
          */
          public class CustomerDaoTest extends SpringDAOTestCase {

             private CustomerDAOHibernateImpl customerDAO;

             protected void onSetUpInTransaction() throws Exception {
                 super.onSetUpInTransaction();
                 //this.setPopulateProtectedVariables(true);
                 customerDAO = (CustomerDAOHibernateImpl) this.applicationContext.getBean("customerDAO");
             }

             protected void onTearDownInTransaction() {
                 customerDAO = null;
             }

             public void testInsert() {
                 Customer customer = new Customer();
                 customer.setName("javaeye");
                 customerDAO.add(customer);
                 String name = (String) jdbcTemplate.queryForObject("select name from customer where id=?", new Object[]{customer.getId()}, String.class);
                
                 assertEquals(customer.getName(), name);
             }

          }


          最后看看配置文件test.xml:

          <?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類會自動裝配的。

          運行之后,就可以看到應有的結果,并且數(shù)據(jù)庫中不會有數(shù)據(jù)污染。這個過程主要是開始一個transaction,然后開始你的test方法,執(zhí)行dao操作,執(zhí)行sql查詢驗證結果,最后無論成功失敗rollback transaction。

          Trackback地址: http://www.yculblog.com/trackback/0/621226

          posted on 2005-05-07 23:56 笨笨 閱讀(485) 評論(0)  編輯  收藏 所屬分類: J2EEHibernateAndSpringALL
          主站蜘蛛池模板: 凤凰县| 融水| 神农架林区| 翼城县| 措美县| 曲阜市| 三穗县| 德昌县| 山西省| 宜兰县| 深水埗区| 中西区| 大港区| 礼泉县| 平潭县| 江阴市| 大田县| 北川| 无为县| 湟中县| 老河口市| 凤城市| 凤翔县| 和龙市| 金平| 建昌县| 青浦区| 仁怀市| 达日县| 宽甸| 正阳县| 两当县| 保德县| 塔河县| 凌源市| 镇安县| 壤塘县| 神农架林区| 鲁山县| 鄂伦春自治旗| 乐平市|