一個很好的DBunit test的架構,和Hibernate結合

          最基本的創建數據庫和打開關閉數據庫使用父類
          public abstract class HibernateBaseTest {

              protected ApplicationContext applicationContext;

              protected HibernateTransactionManager hibernateTransactionManager;

              protected IDatabaseTester databaseTester;

              @Before
              public void setUpHibernate() throws Exception {
                  // BasicConfigurator.configure(); /* for debugging */
                  applicationContext = new ClassPathXmlApplicationContext("hibernate-hsql-context.xml");
                  hibernateTransactionManager = (HibernateTransactionManager) applicationContext
                          .getBean("hibernateTransactionManager");
                  databaseTester = (IDatabaseTester) applicationContext.getBean("dbUnitJdbcDatabaseTester");

              }

              protected QueryDataSet createQueryDataSet() throws SQLException, Exception {
                  QueryDataSet qds = new QueryDataSet(databaseTester.getConnection());
                  qds.addTable("account");
                  return qds;
              }

              @After
              public void tearDown() throws Exception {
                  if (databaseTester != null) {
                      databaseTester.setTearDownOperation(DatabaseOperation.DELETE_ALL);
                      databaseTester.onTearDown();
                  }
              }
          }

          配置文件為:
          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:context="http://www.springframework.org/schema/context"
                 xmlns:util="http://www.springframework.org/schema/util"
                 xsi:schemaLocation="
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

              <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
                  <property name="targetClass" value="nl.enovation.ems.message.repository.DataSourceUserType"/>
                     <property name="targetMethod" value="setDefaultDataSourceRepository"/>
                     <property name="arguments">
                       <list>
                             <ref bean="dataSourceRepository"/>
                       </list>
                     </property>
              </bean>
             
              <bean id="dataSourceRepository" class="nl.enovation.ems.message.repository.FileSectionDataSourceRepository">
                  <property name="baseDir" value="/var/lib/ems/messages"/>
              </bean>
             
              <bean id="jdbcDataSourceRepository" class="nl.enovation.ems.message.repository.JdbcDataSourceRepository">
                  <property name="jdbcTemplate" ref="jdbcTemplate"/>
                  <property name="lobHandler" ref="lobHandler"/>
              </bean>
             
              <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
                  <property name="sessionFactory">
                      <ref local="hibernateSessionFactory" />
                  </property>
              </bean>

              <bean id="hibernateSessionFactory"
                  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                  <property name="mappingResources">
                      <list>
                          <value>META-INF/Message.hbm.xml</value>
                          <value>META-INF/Account.hbm.xml</value>
                          <value>META-INF/Rule.hbm.xml</value>
                          <value>META-INF/Destination.hbm.xml</value>
                          <value>META-INF/MessageSearchCriteria.hbm.xml</value>               
                          <value>META-INF/ReportRule.hbm.xml</value>
                          <value>META-INF/NotificationRule.hbm.xml</value>
                          <value>META-INF/InboxEntry.hbm.xml</value>           
                      </list>
                  </property>
                  <property name="hibernateProperties">
                      <props>
                          <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                          <prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop>
                          <prop key="hibernate.connection.url">jdbc:hsqldb:mem:ems</prop>
                          <prop key="hibernate.connection.username">sa</prop>
                          <prop key="hibernate.connection.password"></prop>
                          <prop key="hibernate.connection.pool_size">1</prop>
                          <prop key="hibernate.connection.autocommit">true</prop>
                          <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
                          <prop key="org.hibernate.SQL">true</prop>
                          <prop key="hibernate.hbm2ddl.auto">create</prop>
                      </props>
                  </property>
              </bean>

              <bean id="hibernateTransactionManager"
                  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                  <property name="sessionFactory">
                      <ref bean="hibernateSessionFactory" />
                  </property>
              </bean>
             
              <bean name="dbUnitJdbcDatabaseTester" class="nl.enovation.ems.domain.BooleanSupportingJdbcDatabaseTester">
                  <constructor-arg value="org.hibernate.dialect.HSQLDialect"/>
                  <constructor-arg value="jdbc:hsqldb:mem:ems"/>
                  <property name="username" value="sa"/>
                  <property name="password" value=""/>
              </bean>   
             
              <bean id="accountRepository" class="nl.enovation.ems.domain.HibernateAccountRepository">
                  <property name="hibernateTemplate">
                      <ref bean="hibernateTemplate"/>
                  </property>
              </bean>
             
              <bean id="messageRepository" class="nl.enovation.ems.domain.HibernateMessageRepository">
                  <property name="hibernateTemplate">
                      <ref bean="hibernateTemplate"/>
                  </property>
                  <property name="hibernateQueryManager">
                      <ref local="hibernateQueryManager" />
                  </property>       
              </bean>
             
              <bean id="hibernateQueryManager" class="nl.enovation.commons.query.hibernate.HibernateQueryManager">
                  <property name="idGenerator">
                      <bean class="nl.enovation.commons.SimpleIdGenerator"/>           
                  </property>
                  <property name="sessionFactory">
                      <ref local="hibernateSessionFactory"/>
                  </property>
                  <property name="maxIdleTime" value="30000"/>
                  <property name="maxResults" value="1501"/>
              </bean>
             
              <bean id="jdbcMessageRepository"
                  class="nl.enovation.ems.domain.JdbcMessageRepository">
                  <property name="jdbcTemplate">
                      <ref local="jdbcTemplate" />
                  </property>
                  <property name="contentPersister">
                      <bean class="nl.enovation.ems.message.repository.test.DataSourcePersisterMock"/>
                  </property>
              </bean>

              <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                  <property name="dataSource" ref="dataSource" />
              </bean>
             
              <bean id="jdbcTransactionManager"
                  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                  <property name="dataSource" ref="dataSource" />
              </bean>

              <bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
                  <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
                  <property name="url" value="jdbc:hsqldb:mem:ems"/>
                  <property name="username" value="sa"/>
                  <property name="password" value=""/>
              </bean>

              <bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">
                  <property name="nativeJdbcExtractor">
                      <bean class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />
                  </property>
              </bean>

              <bean class="nl.enovation.ems.message.repository.DataSourceUserType" scope="prototype">
                  <property name="dataSourceRepository">
                      <bean class="nl.enovation.ems.message.repository.JdbcDataSourceRepository">
                          <property name="jdbcTemplate" ref="jdbcTemplate" />
                          <property name="lobHandler" ref="lobHandler" />
                      </bean>
                  </property>
              </bean>   
          </beans>


          一個測試類為:
          package nl.enovation.ems.domain;

          import java.sql.SQLException;
          import java.util.Set;

          import javax.activation.DataSource;

          import nl.enovation.commons.datasource.FileSectionDataSource;

          import org.dbunit.Assertion;
          import org.dbunit.database.QueryDataSet;
          import org.dbunit.dataset.CompositeDataSet;
          import org.dbunit.dataset.IDataSet;
          import org.dbunit.dataset.ITable;
          import org.dbunit.dataset.filter.DefaultColumnFilter;
          import org.dbunit.dataset.xml.XmlDataSet;
          import org.junit.Before;
          import org.junit.Ignore;
          import org.junit.Test;
          import org.springframework.core.io.Resource;
          import org.springframework.transaction.TransactionDefinition;
          import org.springframework.transaction.TransactionStatus;
          import org.springframework.transaction.support.DefaultTransactionDefinition;

          import static org.junit.Assert.assertEquals;
          import static org.junit.Assert.assertNotNull;
          import static org.junit.Assert.assertThat;
          import static org.hamcrest.CoreMatchers.*;

          public class HibernateInboxPersistenceTest extends HibernateBaseTest {

              private AccountRepository accountRepository;

              private MessageRepository messageRepository;

              private IDataSet addExpectedDataSet;

              private CompositeDataSet deleteExpectedDataSet;

              @Before
              public void setUp() throws Exception {
                  messageRepository = (MessageRepository) applicationContext.getBean("messageRepository");
                  accountRepository = (AccountRepository) applicationContext.getBean("accountRepository");
                  Resource inboxDataSetResource = applicationContext.getResource("store-inbox-dataset.xml");
                  Resource messageDataSetResource = applicationContext.getResource("store-message-dataset.xml");
                  Resource accountDataSetResource = applicationContext.getResource("shared-account-dataset.xml");

                  CompositeDataSet ds = new CompositeDataSet(new IDataSet[] {
                          new XmlDataSet(accountDataSetResource.getInputStream()),
                          //new XmlDataSet(messageDataSetResource.getInputStream()),
                          new XmlDataSet(inboxDataSetResource.getInputStream()) });
                  databaseTester.setDataSet(ds);
                 
                  Resource inboxAddDataSetResource = applicationContext.getResource("store-inbox-add-assert-dataset.xml");
                  addExpectedDataSet = new CompositeDataSet(new IDataSet[] {
                          new XmlDataSet(accountDataSetResource.getInputStream()),
                          //new XmlDataSet(messageDataSetResource.getInputStream()),
                          new XmlDataSet(inboxAddDataSetResource.getInputStream()) });

                  Resource inboxDeleteDataSetResource = applicationContext.getResource("store-inbox-delete-assert-dataset.xml");
                  messageDataSetResource = applicationContext.getResource("store-message-inbox-delete-dataset.xml");
                  deleteExpectedDataSet = new CompositeDataSet(new IDataSet[] {
                          new XmlDataSet(accountDataSetResource.getInputStream()),
                          //new XmlDataSet(messageDataSetResource.getInputStream()),
                          new XmlDataSet(inboxDeleteDataSetResource.getInputStream()) });

                  databaseTester.onSetup();
              }

              @Test
              public void testAddInboxEntry() throws SQLException, Exception {
                  DefaultTransactionDefinition txdef = new DefaultTransactionDefinition();
                  txdef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

                  TransactionStatus tx = hibernateTransactionManager.getTransaction(txdef);

                  Account account = accountRepository.findById("1");
                  assertNotNull(account);
                  Message message = messageRepository.findById("2@lms");
                  assertNotNull(message);

                  account.addToInbox(message);
                  hibernateTransactionManager.commit(tx);

                  QueryDataSet qds = new QueryDataSet(databaseTester.getConnection());
                  qds.addTable("inbox");
                  qds.addTable("account");
                  qds.addTable("message");
                  qds.addTable("destination");
                  qds.addTable("contentstatistic");
                  Assertion.assertEquals(addExpectedDataSet, qds);
              }

              @Test
              public void testRetrieveInboxEntry() throws SQLException, Exception {
                  DefaultTransactionDefinition txdef = new DefaultTransactionDefinition();
                  txdef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

                  {
                      TransactionStatus tx = hibernateTransactionManager.getTransaction(txdef);

                      Account account = accountRepository.findById("1");
                      assertNotNull(account);
                      Message message = messageRepository.findById("2@lms");
                      assertNotNull(message);

                      account.addToInbox(message);
                      hibernateTransactionManager.commit(tx);
                  }
                  {
                      TransactionStatus tx = hibernateTransactionManager.getTransaction(txdef);

                      Account account = accountRepository.findById("1");
                      assertNotNull(account);

                      Set<InboxEntry> inbox = account.getInbox();
                      InboxEntry entry = inbox.iterator().next();
                      assertEquals("2@lms", entry.getMessage().getId());
                      DataSource dataSource = entry.getContent();
                      assertThat(dataSource, instanceOf(FileSectionDataSource.class));
                      assertThat(dataSource.getName(), is("20070904.0:656071:1723"));
                      hibernateTransactionManager.commit(tx);
                  }
              }

              @Test
              @Ignore(value = "Should not throw an exception, but HSQLDB does")
              public void testAddDuplicateInboxEntry() throws SQLException, Exception {
                  DefaultTransactionDefinition txdef = new DefaultTransactionDefinition();
                  txdef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

                  TransactionStatus tx = hibernateTransactionManager.getTransaction(txdef);

                  Account account = accountRepository.findById("1");
                  assertNotNull(account);
                  Message message = messageRepository.findById("2@lms");
                  assertNotNull(message);

                  account.addToInbox(message);
                  account.addToInbox(message);
                  hibernateTransactionManager.commit(tx);

                  QueryDataSet qds = new QueryDataSet(databaseTester.getConnection());
                  qds.addTable("inbox");
                  qds.addTable("account");
                  qds.addTable("message");
                  qds.addTable("destination");
                  qds.addTable("contentstatistic");
                  Assertion.assertEquals(addExpectedDataSet, qds);
              }

              @Test
              public void testDeleteInboxEntry() throws SQLException, Exception {
                  DefaultTransactionDefinition txdef = new DefaultTransactionDefinition();
                  txdef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

                  TransactionStatus tx = hibernateTransactionManager.getTransaction(txdef);

                  Account account = accountRepository.findById("2");
                  assertNotNull(account);

                  Message message = messageRepository.findById("2@lms");
                  assertNotNull(message);

                  InboxEntry entry = account.getInbox().iterator().next();
                  entry.delete();

                  // account.removeFromInbox(new InboxEntry(account, message));

                  hibernateTransactionManager.commit(tx);

                  QueryDataSet qds = new QueryDataSet(databaseTester.getConnection());
                  qds.addTable("inbox");
                  qds.addTable("account");
                  qds.addTable("message");
                  qds.addTable("destination");
                  qds.addTable("contentstatistic");

                  ITable filteredTable = DefaultColumnFilter.excludedColumnsTable(qds.getTable("destination"),
                          new String[] { "statetimestamp" });

                  Assertion.assertEquals(deleteExpectedDataSet.getTable("destination"), filteredTable);
                  // Assertion.assertEquals(deleteExpectedDataSet,qds);
              }
          }


          posted on 2008-07-18 10:49 劉錚 閱讀(1090) 評論(1)  編輯  收藏 所屬分類: DBUnit

          評論

          # re: 一個很好的DBunit test的架構,和Hibernate結合 2010-10-16 22:38 discoverer

          不完整  回復  更多評論   

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          留言簿(1)

          文章分類(141)

          文章檔案(147)

          搜索

          最新評論

          主站蜘蛛池模板: 迁安市| 新干县| 乐山市| 昆山市| 措勤县| 突泉县| 临沂市| 丽水市| 龙川县| 海口市| 云霄县| 陈巴尔虎旗| 金沙县| 依安县| 崇文区| 漯河市| 麟游县| 新安县| 华池县| 农安县| 万州区| 黑龙江省| 思茅市| 航空| 平定县| 石门县| 保山市| 子长县| 青海省| 龙江县| 沈阳市| 涟水县| 芦溪县| 建瓯市| 长子县| 北辰区| 石渠县| 延津县| 东乌珠穆沁旗| 响水县| 玛多县|