2014-09-18 2 views
0

Я делаю некоторые модульные тесты с использованием DBUnit. Я могу правильно вставить набор данных из XML-файла, но после того, как все будет завершено, я не смогу очистить набор данных.DBUnit throwing NoSuchColumnException при удалении набора данных

Ниже моя схема таблицы для столбца ID (я пропущены другие столбцы здесь):

FIELD  TYPE    COLLATION   NULL KEY  DEFAULT  Extra   PRIVILEGES      
----------- ---------------- ----------------- ------ ------ ------------ -------------- ------------------------------- 
ID   INT(11) UNSIGNED (NULL)    NO  PRI  (NULL)  AUTO_INCREMENT SELECT,INSERT,UPDATE,REFERENCES 

Ниже XML sataset:

<dataset> 
    <MY_TABLE NAME="NISAY" /> 
</dataset> 

Я использую FlatXmlDataSetBuilder для создания набора данных , При создании я использую InsertIdentityOperation.INSERT.execute(iConnection, dataSet); и для удаления Я использую InsertIdentityOperation.DELETE.execute(iConnection, dataSet);

Набор данных вставлен должным образом в базу данных, но в то время как удаление, оно проливает ниже исключение:

org.dbunit.dataset.NoSuchColumnException: MY_TABLE.ID - (Non-uppercase input column: ID) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive. 
    at org.dbunit.dataset.AbstractTableMetaData.getColumnIndex(AbstractTableMetaData.java:117) 
    at org.dbunit.dataset.AbstractTable.getColumnIndex(AbstractTable.java:78) 
    at org.dbunit.dataset.DefaultTable.getValue(DefaultTable.java:197) 
    at org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:189) 

Просто, чтобы проверить, что каждая вещь собственно, я удалил unsigned ограничение из столбца ID и использовал набор данных ниже:

<dataset> 
    <MY_TABLE ID="-99" NAME="NISAY" /> 
</dataset> 

Используя описанное выше, все работало нормально. Однако идентификатор должен быть unsigned. Как сообщить DBUnit игнорировать основной ключ при удалении? Я пробовал использовать фильтры, но не уверен, правильно ли они настроены.

ответ

0

Итак, проблема в том, что вы не можете указать идентификатор в файле XML, потому что идентификатор должен быть сгенерирован автоматически. И DBUnit удаляет строки на основе первичного ключа. Поскольку я не предоставлял первичный ключ (т. Е. ID), DBUnit не удалось удалить набор данных.

Сделать фиктивный первичный ключ для набора данных. Первые реализации IColumnFilter

class MyPrimaryKeyFilter implements IColumnFilter { 
     private String pseudoKey = null; 

     MyPrimaryKeyFilter(String pseudoKey) { 
      this.pseudoKey = pseudoKey; 
     } 

     public boolean accept(String tableName, Column column) { 
      return column.getColumnName().equalsIgnoreCase(pseudoKey); 
     } 

} 

Затем установите PROPERTY_PRIMARY_KEY_FILTER, как показано ниже:

DatabaseConfig config = iConnection.getConfig(); 
config.setProperty(DatabaseConfig.PROPERTY_PRIMARY_KEY_FILTER, new MyPrimaryKeyFilter("SOME_OTHER_COLUMN_TO_BE_TREATED_AS_PK")); 

Теперь столбец SOME_OTHER_COLUMN_TO_BE_TREATED_AS_PK будет рассматриваться в качестве первичного ключа, и вы можете предоставить какое-либо значение для этого столбца в файле набор данных XML ,

0

У меня была такая же ошибка (исключение NoSuchColumnException) в определенном столбце с пользовательским типом данных (используется DatabaseConfig.PROPERTY_DATATYPE_FACTORY, новый OracleDataTypeFactory()).

извлекал набор данных с:

IDatabaseTester databaseTester =new JdbcDatabaseTester("oracle.jdbc.driver.OracleDriver", 
      address, "user", "password", "schema"); 
QueryDataSet queryDataSet = new QueryDataSet(databaseTester.getConnection()); 

String query = "SELECT * FROM CARS WHERE ID LIKE '123456'"; 
queryDataSet.addTable("FACTORY.CARS", query); 

и вышеуказанная набор данных был предназначен для использования в:

DatabaseOperation.DELETE.execute(connection, queryDataSet); 

решаемые путем изменения запроса, чтобы возвращать только colums необходимые для идентификации строки, которые необходимо удалить (исключая строки с пользовательскими типами данных), и Исключение прекращено:

String query = "SELECT CAR_ID FROM CARS WHERE LICENSE_PLATE LIKE 'AB-FV-XY'"; 
Смежные вопросы