01)概述
基於DBunit做基於數據庫的單元測試,數據庫表的準備數據由框架負責插入和自動清理,目前數據庫中很多業務操作是基於視圖的(包括普通視圖和物理視圖),hop測試框架本身並不支持對視圖的直接插入和更新操作,因此對視圖做測試準備數據的時候,必須造出與視圖相關聯的各個表的數據,再進行測試
02)普通視圖
一般性的視圖,對這種視圖做準備數據只有找到該視圖的關聯表,利用框架提供的工具類DbunitManager造出測試數據(造的數據必須和視圖邏輯關聯),然後運行單元測試用例,這種視圖只要基礎表裏插入了數據,則視圖中會自動實時同步過來(可以把這類視圖簡單理解爲只讀視圖)。
03)物化視圖
物化視圖是oracle數據庫特有的一種視圖,首先它屬於視圖的範疇,因此滿足視圖的定義,同時,有自身的特點,就是當向物理視圖關聯的數據庫表插數據時,物理視圖裏的數據同步並不一定是實時的,爲了保證我們造的測試數據能夠實時的在物理視圖中得以體現,必須在基礎表數據插入後,對物理視圖做手動刷新-強制物理視圖同步最新數據。
使用方法
- 準備於物化視圖相關聯的幾張基礎數據表的數據-通過dbunit xml格式,詳細參考單元測試規範章節
- 編寫測試代碼-和先前的做法完全一致
- 在該測試用例執行前執行物化視圖的刷新操作
public void testGetProductbyUserId() {
String mv = "ECC_FND.PRODUCT_LINE_MV";//要進行刷新的物化視圖的名字
refeshMaterializedView(mv );//測試用例執行前刷新一下,保證準備好的基礎數據同步到視圖中
List<CmiAssistmodel> list=baseSeachConditionService.getProductbyUserId();//執行具體的測試
assertThat(list.size(), equalTo(2));//斷言
}
03)物化視圖
刷新物化視圖的操作見 void refeshMaterializedView(String materializedViewName)
/**
* HOP測試框架的基類,定義了常用到的工具類
* @author WangXuzheng
* @see com.haier.openplatform.test.dbunit.XmlDatasetProviderListener
* @see com.haier.openplatform.test.dbunit.IDatabaseTesterAware
* @see org.springframework.test.context.transaction.TransactionalTestExecutionListener
*/
@TestExecutionListeners({ XmlDatasetProviderListener.class, TransactionalTestExecutionListener.class })
public class BaseHopTestCase extends AbstractJUnit4SpringContextTests implements IDatabaseTesterAware{
protected IDatabaseTester databaseTester;
@Override
public void setIDatabaseTester(IDatabaseTester databaseTester) {
this.databaseTester = databaseTester;
}
/**
* 利用dbunit的connection執行sql語句
* @param sql
*/
protected void executeSQL(String sql){
Connection connection = null;
Statement statement = null;
try {
connection = databaseTester.getConnection().getConnection();
statement = connection.createStatement();
statement.execute(sql);
}catch (Exception e) {
ReflectionUtils.handleReflectionException(e);
}finally{
closeStatement(statement);
closeConnection(connection);
}
}
/**
* 關閉數據庫連接
* @param connection
*/
protected void closeConnection(Connection connection) {
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
ReflectionUtils.handleReflectionException(e);
}
}
}
/**
* 關閉sql語句對象
* @param statement
*/
protected void closeStatement(Statement statement){
if(statement != null){
try {
statement.close();
} catch (SQLException e) {
ReflectionUtils.handleReflectionException(e);
}
}
}
/**
* 生成默認的刷新物化視圖的sql語句--僅限於oracle
* @param materializedViewName 物化視圖的名字
* @return
*/
protected String generateRefeshMaterializedViewSql(String materializedViewName){
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("BEGIN")
.append(" DBMS_SNAPSHOT.REFRESH")
.append(" (LIST => '")
.append(materializedViewName).append("'")
.append(" ,PUSH_DEFERRED_RPC => TRUE")
.append(" ,REFRESH_AFTER_ERRORS => FALSE")
.append(" ,PURGE_OPTION => 1")
.append(" ,PARALLELISM => 0")
.append(" ,ATOMIC_REFRESH => TRUE")
.append(" ,NESTED => FALSE);")
.append(" END;");
return stringBuffer.toString();
}
/**
* 刷新指定的物化視圖
* @param materializedViewName 物化視圖名字
*/
protected void refeshMaterializedView(String materializedViewName){
executeSQL(generateRefeshMaterializedViewSql(materializedViewName));
}
}