如果希望業(yè)務類也支持事務處理可以加入以下配置,否則可以略過:
<bean id="accountManagerTarget" class="com.wang.dbunit.AccountManager">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<bean id="accountManager" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>
com.wang.dbunit.IAccountManager
</value>
</property>
<property name="interceptorNames">
<list>
<idref local="transactionInterceptor" />
<idref local="accountManagerTarget" />
</list>
</property>
</bean>
以上配置只作用于使業(yè)務類,因為我們的測試用例類“HelloDBUnit.java”沒有出現(xiàn)在配置文件中,更沒有設置任何攔截器,所以測試用例對數(shù)據(jù)庫的所有操作(插入、清除測試數(shù)據(jù))目前都不在攔截范圍。我們必須在測試用例中手工為它加入事務處理,才可以達到我們的目的。
添加事務管理代碼
添加以下屬性和方法:
private TransactionStatus ts = null;
private DataSourceTransactionManager transactionManager = null;
......
protected void setUpTransaction()
{
transactionManager
=(DataSourceTransactionManager)context.getBean(
"transactionManager");
TransactionDefinition td = new DefaultTransactionDefinition();
ts = transactionManager.getTransaction(td);
}
protected void tearDownTransaction(boolean commit)
{
if(commit)
{
transactionManager.commit(ts);
}
else
{
transactionManager.rollback(ts);
}
}
修改setUp和tearDown方法:
protected void setUp() throws Exception
{
setUpTransaction();
DataSourced ataSource = getDataSource();
// 替換 Connection connection = dataSource.getConnection();
Connection connection = DataSourceUtils.getConnection(dataSource);
IDatabaseConnection dbUnitCon
= new DatabaseConnection(connection, "SYSTEM");
if(getDataSet()!= null)
{
try
{
getSetUpOperation().execute(dbUnitCon, getDataSet());
}
finally
{
if(connection!= null)
{
// 替換 connection.close();
DataSourceUtils.releaseConnection(
connection, dataSource);
}
}
}
}
protected void tearDown() throws Exception
{
DataSource dataSource = getDataSource();
// 替換 Connection connection = dataSource.getConnection();
Connection connection = DataSourceUtils.getConnection(dataSource);
IDatabaseConnection dbUnitCon
= new DatabaseConnection(connection, "SYSTEM");
if(getDataSet() != null)
{
try
{
// 如果不希望回滾數(shù)據(jù),傳入 true 參數(shù)。
tearDownTransaction(false);
getTearDownOperation().execute(dbUnitCon, getDataSet());
}
finally
{
if(connection!= null)
{
// 替換 connection.close();
DataSourceUtils.releaseConnection(
connection, dataSource);
}
}
}
}
后修改getTearDownOperation,用 DELETE 替換 DELETE_ALL:
protected DatabaseOperation getTearDownOperation() throws Exception
{
return DatabaseOperation.DELETE;
}
現(xiàn)在在表中隨便添加一些記錄,然后執(zhí)行我們的測試用例,執(zhí)行完后,手工添加的數(shù)據(jù)沒有受到任何影響。
后一點提示
因為每一個 testXxx 方法時都會初始化一個測試用例,所以每執(zhí)行一次 testXxxx 方法都會導致 setUp 和 tearDown 方法被調(diào)用一次,而本例的事務定義也都由 setUp 開始, tearDown 結(jié)束,也意味著不同測試方法(同一測試用例)之間處于不同的事務范圍,導致數(shù)據(jù)操作結(jié)果無法共享(如果每次 tearDown 都回滾數(shù)據(jù))。比如在 testInsert 方法中插入數(shù)據(jù),在 testSelect 無法獲得。要解決這個問題,要適當?shù)男薷膶?setUpTransaction 和 dearDownTransaction 的調(diào)用,使得事務可以在全局范圍內(nèi)被多個 test 方法共享。
E:workpm2_v1_00 est.xml:171: org.dbunit.dataset.NoSuchTableException: VERSION_INFO
DBunit 要求schema 大寫google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);