2012-01-05 53 views
2

一些背景:

我做彈簧批POC取代了數據提取和報告框架。我們從Oracle數據庫讀取數據並從那裏生成CSV報告。現在我有這個工作和單元測試連接到一個oracle數據庫。不過,我寧願刪除Oracle數據庫的外部依賴性來測試。重新創建設置數據H2 DB通過DbUnit的

問題:

當談到時間將數據添加到數據庫DbUnit是抱怨表「賬戶」不存在。

日誌:

我可以看到SQL下降,並創建表被解僱:

06:54:58,940 DEBUG org.springframework.jdbc.core.JdbcTemplate:417 - Executing SQL statement [DROP TABLE ACCOUNT CASCADE CONSTRAINTS] 
06:54:58,988 DEBUG org.springframework.jdbc.core.JdbcTemplate:417 - Executing SQL statement [CREATE TABLE ACCOUNT (ID NUMBER(22) NOT NULL, CURRENT_BALANCE NUMBER(22) NOT NULL, RESERVED_AMOUNT NUMBER(22), ACCOUNT_TYPE VARCHAR2(50) NOT NULL, CURRENCY_CODE CHAR(3) NOT NULL, ACCOUNT_STATUS VARCHAR2(50) NOT NULL, PRODUCT_ID NUMBER(22) DEFAULT 0, CLIENT_CODE VARCHAR2(50) NOT NULL, LEDGER_ACCOUNT_TYPE VARCHAR2(50), CHANGED_BY VARCHAR2(50) NOT NULL, CHANGED_ON TIMESTAMP(6) NOT NULL, VERSION INTEGER DEFAULT 0, ACTIVATION_DATE TIMESTAMP(6), NEXT_BILLING_DATE TIMESTAMP(6), MSISDN VARCHAR2(50), IS_DEFAULT CHAR(1) DEFAULT '0', CONSTRAINT PK_ACCOUNT PRIMARY KEY (ID))] 

我有一個SQL腳本創建數據庫架構和DbUnit的填充平整的xml數據。從日誌,我可以看到以下情況發生:

DBUnit的負荷XML數據:

06:54:59,886 DEBUG org.dbunit.dataset.xml.FlatXmlProducer:414 - startElement(uri=, localName=, qName=ACCOUNT, attributes=com.sun.org.a[email protected]1e2b807) - start 
06:54:59,886 DEBUG org.dbunit.dataset.OrderedTableNameMap:149 - getLastTableName() - start 
06:54:59,886 DEBUG org.dbunit.dataset.OrderedTableNameMap:127 - isLastTable(tableName=ACCOUNT) - start 
06:54:59,886 DEBUG org.dbunit.dataset.OrderedTableNameMap:253 - getTableName(tableName=ACCOUNT) - start 
06:54:59,886 DEBUG org.dbunit.dataset.OrderedTableNameMap:264 - getTableName(tableName=ACCOUNT) - end - result=ACCOUNT 
06:54:59,887 DEBUG org.dbunit.dataset.xml.FlatXmlProducer:184 - createTableMetaData(tableName=ACCOUNT, attributes=com.sun.org.a[email protected]1e2b807) - start 
06:54:59,912 DEBUG org.dbunit.dataset.Columns:71 - getColumns(columnNames=[], columns=[(ID, UNKNOWN, nullableUnknown), (CURRENT_BALANCE, UNKNOWN, nullableUnknown), (RESERVED_AMOUNT, UNKNOWN, nullableUnknown), (ACCOUNT_TYPE, UNKNOWN, nullableUnknown), (CURRENCY_CODE, UNKNOWN, nullableUnknown), (ACCOUNT_STATUS, UNKNOWN, nullableUnknown), (PRODUCT_ID, UNKNOWN, nullableUnknown), (CLIENT_CODE, UNKNOWN, nullableUnknown), (LEDGER_ACCOUNT_TYPE, UNKNOWN, nullableUnknown), (CHANGED_BY, UNKNOWN, nullableUnknown), (CHANGED_ON, UNKNOWN, nullableUnknown), (VERSION, UNKNOWN, nullableUnknown), (IS_DEFAULT, UNKNOWN, nullableUnknown)]) - start 
06:54:59,912 DEBUG org.dbunit.dataset.OrderedTableNameMap:191 - add(tableName=ACCOUNT, object=tableName=ACCOUNT, columns=[(ID, UNKNOWN, nullableUnknown), (CURRENT_BALANCE, UNKNOWN, nullableUnknown), (RESERVED_AMOUNT, UNKNOWN, nullableUnknown), (ACCOUNT_TYPE, UNKNOWN, nullableUnknown), (CURRENCY_CODE, UNKNOWN, nullableUnknown), (ACCOUNT_STATUS, UNKNOWN, nullableUnknown), (PRODUCT_ID, UNKNOWN, nullableUnknown), (CLIENT_CODE, UNKNOWN, nullableUnknown), (LEDGER_ACCOUNT_TYPE, UNKNOWN, nullableUnknown), (CHANGED_BY, UNKNOWN, nullableUnknown), (CHANGED_ON, UNKNOWN, nullableUnknown), (VERSION, UNKNOWN, nullableUnknown), (IS_DEFAULT, UNKNOWN, nullableUnknown)], keys=[]) - start 
06:54:59,913 DEBUG org.dbunit.dataset.OrderedTableNameMap:253 -getTableName(tableName=ACCOUNT) - start 
06:54:59,913 DEBUG org.dbunit.dataset.OrderedTableNameMap:264 - getTableName(tableName=ACCOUNT) - end - result=ACCOUNT 
06:54:59,913 DEBUG org.dbunit.dataset.OrderedTableNameMap:253 - getTableName(tableName=ACCOUNT) - start 
06:54:59,913 DEBUG org.dbunit.dataset.OrderedTableNameMap:264 - getTableName(tableName=ACCOUNT) - end - result=ACCOUNT 
06:54:59,913 DEBUG org.dbunit.dataset.CachedDataSet:135 - startTable(metaData=tableName=ACCOUNT, columns=[(ID, UNKNOWN, nullableUnknown), (CURRENT_BALANCE, UNKNOWN, nullableUnknown), (RESERVED_AMOUNT, UNKNOWN, nullableUnknown), (ACCOUNT_TYPE, UNKNOWN, nullableUnknown), (CURRENCY_CODE, UNKNOWN, nullableUnknown), (ACCOUNT_STATUS, UNKNOWN, nullableUnknown), (PRODUCT_ID, UNKNOWN, nullableUnknown), (CLIENT_CODE, UNKNOWN, nullableUnknown), (LEDGER_ACCOUNT_TYPE, UNKNOWN, nullableUnknown), (CHANGED_BY, UNKNOWN, nullableUnknown), (CHANGED_ON, UNKNOWN, nullableUnknown), (VERSION, UNKNOWN, nullableUnknown), (IS_DEFAULT, UNKNOWN, nullableUnknown)], keys=[]) - start 
06:54:59,916 DEBUG org.dbunit.dataset.OrderedTableNameMap:149 - getLastTableName() - start 
06:54:59,916 DEBUG org.dbunit.dataset.OrderedTableNameMap:253 - getTableName(tableName=ACCOUNT) - start 
06:54:59,916 DEBUG org.dbunit.dataset.OrderedTableNameMap:264 - getTableName(tableName=ACCOUNT) - end - result=ACCOUNT 
06:54:59,916 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=ID) - start 
06:54:59,917 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=CURRENT_BALANCE) - start 
06:54:59,917 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=RESERVED_AMOUNT) - start 
06:54:59,933 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=ACCOUNT_TYPE) - start 
06:54:59,933 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=CURRENCY_CODE) - start 
06:54:59,933 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=ACCOUNT_STATUS) - start 
06:54:59,934 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=PRODUCT_ID) - start 
06:54:59,934 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=CLIENT_CODE) - start 
06:54:59,934 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=LEDGER_ACCOUNT_TYPE) - start 
06:54:59,934 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=CHANGED_BY) - start 
06:54:59,934 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=CHANGED_ON) - start 
06:54:59,935 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=VERSION) - start 
06:54:59,935 DEBUG org.dbunit.dataset.AbstractTableMetaData:101 - getColumnIndex(columnName=IS_DEFAULT) - start 
06:54:59,935 DEBUG org.dbunit.dataset.OrderedTableNameMap:149 - getLastTableName() - start 
06:54:59,935 DEBUG org.dbunit.dataset.OrderedTableNameMap:253 - getTableName(tableName=ACCOUNT) - start 
06:54:59,935 DEBUG org.dbunit.dataset.OrderedTableNameMap:264 - getTableName(tableName=ACCOUNT) - end - result=ACCOUNT 

最後:

06:55:00,037 DEBUG org.dbunit.database.DatabaseDataSet:279 - getTableMetaData(tableName=ACCOUNT) - start 
06:55:00,037 DEBUG org.dbunit.database.DatabaseDataSet:173 - initialize() - start 
06:55:00,037 DEBUG org.dbunit.database.DatabaseDataSet:182 - Initializing the data set from the database... 
06:55:00,037 DEBUG org.dbunit.database.DatabaseDataSourceConnection:113 - getConnection() - start 
06:55:00,090 DEBUG org.dbunit.database.DatabaseDataSet:203 - 
    database product name=H2 
    database version=1.3.163 (2011-12-30) 
    database major version=1 
    database minor version=3 
    jdbc driver name=H2 JDBC Driver 
    jdbc driver version=1.3.163 (2011-12-30) 
    jdbc driver major version=1 
    jdbc driver minor version=3 
06:55:00,090 DEBUG org.dbunit.database.DatabaseDataSet:204 - metadata [email protected] 
06:55:00,090 DEBUG org.dbunit.dataset.OrderedTableNameMap:253 - getTableName(tableName=ACCOUNT) - start 
06:55:00,090 DEBUG org.dbunit.dataset.OrderedTableNameMap:264 - getTableName(tableName=ACCOUNT) - end - result=ACCOUNT 
06:55:00,090 ERROR org.dbunit.database.DatabaseDataSet:286 - Table 'ACCOUNT' not found in tableMap=org.dbunit.dataset.OrderedTableNameMap[_tableNames=[], _tableMap={}, _caseSensitiveTableNames=false] 

代碼

AbstractReportTest.java用於刪除/創建數據庫模式,然後通過dbunit加載數據。

import java.io.File; 
import java.io.IOException; 
import java.sql.SQLException; 
import javax.sql.DataSource; 
import org.dbunit.DatabaseUnitException; 
import org.dbunit.database.DatabaseConfig; 
import org.dbunit.database.DatabaseDataSourceConnection; 
import org.dbunit.database.IDatabaseConnection; 
import org.dbunit.dataset.DataSetException; 
import org.dbunit.dataset.xml.FlatXmlDataSet; 
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; 
import org.dbunit.operation.DatabaseOperation; 
import org.junit.Assert; 
import org.junit.Before; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.core.io.Resource; 
import org.springframework.dao.DataAccessException; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.transaction.annotation.Transactional; 
import org.springframework.util.FileCopyUtils; 

@Transactional 
public abstract class AbstractReportTest { 
    private static final Logger LOG = LoggerFactory.getLogger(AbstractReportTest.class); 

    protected static final String NEW_LINE = System.getProperty("line.separator"); 
    private static final String DROP_SQL = "DROP"; 

    @Autowired 
    private DataSource datasource; 

    @Autowired 
    @Qualifier(value="testData") 
    private Resource testData; 

    @Autowired 
    @Qualifier(value="createScript") 
    private Resource createScript; 

    @Autowired 
    private JdbcTemplate template; 

    protected abstract String getSchema(); 

    @Before 
    public void init() { 
     IDatabaseConnection dbUnitCon = null; 
     try { 
      recreateDb(); 

      dbUnitCon = new DatabaseDataSourceConnection(datasource, getSchema()); 
      dbUnitCon.getConfig().setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true); 

      FlatXmlDataSetBuilder dataBuilder = new FlatXmlDataSetBuilder(); 
      FlatXmlDataSet dataset = dataBuilder.build(testData.getFile()); 

      DatabaseOperation.INSERT.execute(dbUnitCon, dataset); 
     } catch(IOException ioException) { 
      LOG.error("", ioException); 

      Assert.fail(); 
     } catch(DataSetException dse) { 
      LOG.error("", dse); 

      Assert.fail(); 
     } catch (DatabaseUnitException due) { 
      LOG.error("", due); 

      Assert.fail(); 
     } catch (SQLException sqlException) { 
      LOG.error("", sqlException); 

      Assert.fail(); 
     } 
    } 

    private void recreateDb() throws IOException { 
     File sqlFile = createScript.getFile(); 
     LOG.info("Loading sql file: {}", sqlFile.getName()); 
     String sql = new String(FileCopyUtils.copyToByteArray(sqlFile)); 

     String[] queries = sql.split(";" + NEW_LINE); 

     LOG.info("Preparing to run {} queries.", queries.length); 
     for(String currentQuery : queries) { 
      try { 
       template.execute(currentQuery); 
      } catch (DataAccessException dae) { 
       if(currentQuery.indexOf(DROP_SQL) == -1) { 
        Assert.fail("Failed creating db tables."); 
       } 
      } 
     } 

     LOG.info("Completed db setup."); 
    } 
} 

Spring配置:

<?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:aop="http://www.springframework.org/schema/aop" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd 
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <util:properties id="jdbcProps" location="classpath:/jdbc.properties" /> 

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="datasource"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="username" value="#{jdbcProps['brandgroup.jdbc.username']}"/> 
     <property name="password" value="#{jdbcProps['brandgroup.jdbc.password']}"/> 
     <property name="url" value="#{jdbcProps['brandgroup.jdbc.url']}"/> 
     <property name="driverClassName" value="#{jdbcProps['brandgroup.jdbc.driver']}"/> 
    </bean> 

    <bean id="testTxnManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="datasource"/> 
    </bean> 

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

</beans> 

的下降/​​創建代碼使用的是相同的數據源爲DB單元部分,所以我不認爲它在MEM H2情況下創建一個新的。

有什麼想法?

+0

'#{jdbcProps ['brandgroup.jdbc.url']}'是什麼值?通常問題是數據庫URL與_current_工作目錄相關(而不是絕對),或者使用內存數據庫,如果該進程退出,則會丟失數據。 – 2012-01-05 10:46:20

+0

屬性文件中的值是 - > jdbc:h2:mem/BRANDGROUPTEST – 2012-01-05 10:55:42

+0

'jdbc:h2:mem/BRANDGROUPTEST'表示存儲在/mem目錄中的持久數據庫。您是否想爲命名的內存數據庫使用'jdbc:h2:mem:BRANDGROUPTEST'? – 2012-01-05 11:32:36

回答

0

我也遇到過這個。當dbunit試圖刪除表時,它沒有找到它,因此也就是問題所在。我通過將「IF EXISTS」添加到我的刪除DDL中來修復它。

希望有所幫助。

+0

感謝您的回覆,我在您的帖子之前添加了該帖,但並不安靜。我決定有1個設置數據腳本(而不是每個單元測試都有一個帶有其數據的xml)似乎已經刪除了我一直有的問題。 – 2012-01-12 09:25:23