16

これを投稿する前に、少しグーグルで検索し、dbunit-user アーカイブと DbUnit バグ リストを少し探しましたが、探しているものが見つかりません。残念ながら、ここでの回答も役に立ちませんでした。

私はDbUnit 2.4.8をMySQL 5.1.xで使用して、setUpにいくつかのJForumテーブルを設定しています。問題は、このスクリプトによって作成された jforum_users テーブルに最初に表示されます

CREATE TABLE `jforum_users` (
       `user_id` INT(11) NOT NULL AUTO_INCREMENT,
       `user_active` TINYINT(1) NULL DEFAULT NULL,
       `username` VARCHAR(50) NOT NULL DEFAULT '',
       `user_password` VARCHAR(32) NOT NULL DEFAULT '',
       [...]
       PRIMARY KEY (`user_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=14

データベースのセットアップ操作として REFRESH を実行すると、次の例外が発生します。

org.dbunit.dataset.NoSuchColumnException: jforum_users.USER_ID -
(Non-uppercase input column: USER_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.operation.AbstractOperation.getOperationMetaData(AbstractOperation.java:89)
       at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:98)
       at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
       at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
       at net.jforum.dao.generic.AbstractDaoTest.setUpDatabase(AbstractDaoTest.java:43)

私はソースを調べましたがAbstractTableMetaData.java、何も - 静的に - 間違っているようには見えません。方法

private Map createColumnIndexesMap(Column[] columns)

用途

columns[i].getColumnName().toUpperCase()

マップキーを書きます。あとはその方法

public int getColumnIndex(String columnName)

用途

String columnNameUpperCase = columnName.toUpperCase();
Integer colIndex = (Integer) this._columnsToIndexes.get(columnNameUpperCase);

マップからオブジェクトを読み取ります。

何が起こっているのか本当に理解できません...誰か助けてください。

最後の@limc回答の後に編集

次のように、を使用しPropertiesBasedJdbcDatabaseTesterて DbUnit env を構成しています。

Properties dbProperties = new Properties();
dbProperties.load(new FileInputStream(testConfDir+"/db.properties"));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, 
    dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, 
    dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, 
    dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, 
    dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD));
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, 
    dbProperties.getProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA));

databaseTester = new PropertiesBasedJdbcDatabaseTester();
databaseTester.setSetUpOperation(getSetUpOperation());
databaseTester.setTearDownOperation(getTearDownOperation());

IDataSet dataSet = getDataSet();
databaseTester.setDataSet(dataSet);

databaseTester.onSetup();
4

9 に答える 9

4

user_id問題がレコード ID の列に起因すると考える理由があります。過去に、行 ID が SQL Server によってネイティブに生成されるという同様の問題があります。私は今、自分のデスクにいないのですが、次の解決策を試してみてください: http://old.nabble.com/case-sensitivity-on-tearDown--td22964025.html

更新 - 02-03-11

ここに実用的なソリューションがあります。これが私のテストコードです:-

MySQL スクリプト

CREATE TABLE `jforum_users` (
       `user_id` INT(11) NOT NULL AUTO_INCREMENT,
       `user_active` TINYINT(1) NULL DEFAULT NULL,
       `username` VARCHAR(50) NOT NULL DEFAULT '',
       PRIMARY KEY (`user_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=14

dbunit-test.xml テスト ファイル

<?xml version='1.0' encoding='UTF-8'?>

<dataset>
    <jforum_users user_id="100" username="First User" />
</dataset>

Java コード

Class.forName("com.mysql.jdbc.Driver");
Connection jdbcConnection = DriverManager.getConnection("jdbc:mysql://localhost:8889/test", "", "");
IDatabaseConnection con = new DatabaseConnection(jdbcConnection);

InputStream is = getClass().getClassLoader().getResourceAsStream("dbunit-test.xml");
IDataSet dataSet = new FlatXmlDataSetBuilder().build(is);
DatabaseOperation.CLEAN_INSERT.execute(con, dataSet);

con.close();

エラーは発生せず、行はデータベースに追加されました。

参考までに、試してみましたがREFRESH、エラーも発生せずに正常に動作します:-

DatabaseOperation.REFRESH.execute(con, dataSet);

DBUnit 2.4.8 と MySQL 5.1.44 を使用しています。

お役に立てれば。

于 2011-02-03T03:12:57.553 に答える
2

このエラーが発生したのは、スキーマの列に not null 制約があったのに、この列がデータファイルにないためでした。

たとえば、私のテーブルには

<table name="mytable">
    <column>id</column>
    <column>entity_type</column>
    <column>deleted</column>
</table>

<dataset>
    <mytable id="100" entity_type"2"/>
</dataset>

削除された列に not null 制約があり、テストを実行すると NoSuchColumnException が発生します。

データセットを次のように変更すると

<mytable id="100" entity_type"2" deleted="0"/>

私は例外を乗り越えます。

于 2017-03-20T12:34:04.350 に答える
0

私の場合、最初に BOM char を持つ UTF-8 でエンコードされた csv ファイルでした。メモ帳を使用してcsvファイルを作成していました。BOM char を保存しないように、メモ帳 ++ を使用します。

于 2016-11-01T12:56:50.993 に答える
0

私はこの問題に直面しました。その理由は、データセット ファイルの dtd に、データを挿入したいテーブルとは異なる記述があったためです。

したがって、データを挿入するテーブルに、dtd ファイルと同じ列があることを確認してください。

データを挿入したテーブルにない列を dtd ファイルで削除すると、問題はなくなりました。

于 2015-11-26T13:10:20.513 に答える
-1

OK 私は同じ問題に直面し、解決策を見つけました. テストデータを作成する方法が間違っています.使用していたデータセットの種類について. 次の形式が正しいxmlデータセットを使用していました. FlatXmlDataSet の場合、別の形式があります。詳細については、以下のリンクを参照してください。xml は次の形式である必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <table>
        <column>id</column>
        <column>name</column>
        <column>department</column>
        <column>startDate</column>
        <column>endDate</column>
        <row>
            <value>999</value>
            <value>TEMP</value>
            <value>TEMP DEPT</value>
            <value>2113-10-13</value>
            <value>2123-10-13</value>
        </row>
    </table>
</dataset>

詳細を知りたい場合は、次のリンクにアクセスしてください: http://dbunit.sourceforge.net/components.html

于 2013-11-21T09:40:43.313 に答える