0

Java データベース コードの別のプログラマーから継承したプロジェクトのテスト スイートを修正しようとしています。プロジェクト自体は DB 用に hibernate と MySQL を使用していますが、テスト ケースの目的で dbunit が使用されています。Hibernate のセッション ファクトリを正しくロードして初期化できますが、Eclipse でテストを実行しようとすると、"org.dbunit.dataset.NoSuchTableException: mytablename" という例外が発生し続けます。

すべてのファイルが適切な場所にあり、dbunit に渡す実際の XML ファイルに問題がないことはわかっています (FlatXmlDataSet タイプを使用しています)。データベース テスト ケースの基本クラスの setUp() メソッドは次のようになります。

@Override
protected void setUp() throws Exception {
    super.setUp();
    IDataSet dataSet = new FlatXmlDataSet(new File(mDataFile));

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    IDatabaseConnection connection = new DatabaseConnection(session.connection());

    DatabaseConfig config = connection.getConfig();
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());

    DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);

    session.getTransaction().commit();
}

CLEAN_INSERT データベース操作の直後に、これがどのテーブルであるかに関係なく、XML ファイルの最後のテーブルについて不平を言う例外がスローされます。DTD と XML スキーマを手作業と Eclipse で検証し、2 つのファイル内のテーブルの順序が一致していることを確認しました。これらのファイルをここに貼り付けたくはありませんが (多くの検索置換が必要になるため)、dbunit の例を調べて、構文が一致することを確認したことを信じてください。

何が間違っている可能性がありますか?私は何時間もグーグルで検索してきましたが、何も役に立ちません。

編集:言い忘れたことの 1 つは、スローする行にブレークポイントを配置すると、dataSet の構造を調べて、すべてのテーブルとすべてのテスト データが実際にそこにあることを確認できることです。したがって、少なくともその部分は正しく機能しているようです。

@Bogdan: うーん... いい考えだ。通常の INSERT でデータをロードしてみます。@sleske: また、良い提案です。ヒントをありがとう; うまくいけば、これは私をこの問題を解決するための正しい道に導きます.

4

3 に答える 3

1

sleske は確かに正しかったです。この問題を解決するには、さらに多くの情報が必要でした。つまり、正しい質問をしていなかったということです。ここでの両方の提案は役に立ちましたが、正しい質問をしていないことを考えると、1 つを正しい答えとしてマークするのは気が進まないので、代わりに、これを機能させるために何をしたかをここに記録します。

基本的に、問題は他のタイプのスキーマの不一致によって引き起こされました。テスト DB の DTD と XML は一致しましたが、DTDは hbm.xml ファイルにリストされている実際のスキーマ (つまり、本番 DB で使用しているもの) と一致しなくなり、XML ファイルのテスト データベースには特定の列がありませでした。後で NOT NULL としてマークされました。また、XML には、.hbm.xml 構成ファイルを持たないテーブルが含まれていました。これは、このコードの元の作成者が、これらのテーブルを使用する機能を作成することができなかったからです。そのため、それらが DTD で指定されていたとしても、対応する HBM マッピングがないために問題が発生しました。

また、 hibernate と dbunit の併用に関するこのブログ記事で見つけた内容に基づいて、データベース テスト ケースの基本クラス コードの一部を書き直す必要がありました。

最後に、実際の構成の代わりに「hibernate-test.cfg.xml」ファイルが使用されるようにビルド プロセスを修正する必要があり、その後はすべて正常に機能しました。ここで、一部のテスト ケースで例外がスローされる理由を突き止める必要があります。:)

于 2009-02-24T09:25:43.550 に答える
1

これを解決するには、より多くの情報が必要です。

これをデバッグしようとしましたか?DBUnit のソース コードを別のプロジェクトとして Eclipse ワークスペースに配置できます。次に、テストの「ビルド パス」を構成して、dbunit.jar の代わりに DBUnit プロジェクトを使用します。そうすれば、DBUnit のコードをデバッグできます。そうすれば、例外がスローされる理由がわかると思います。

于 2009-02-19T03:08:27.020 に答える
1

は基本的にとDatabaseOperation.CLEAN_INSERTの組み合わせです。は逆の順序でテーブルをクリアするため、最後のテーブルをクリアするときに失敗するのではなく、最初のテーブルをクリアするときに失敗すると思われます。DatabaseOperation.DELETE_ALLDatabaseOperation.INSERTDatabaseOperation.DELETE_ALL

テスト中に使用しているデータベースに、データセットのテーブルが実際に存在することを確信していますか? あなたが得ているエラーは、そうではないことを示唆しています。

于 2009-02-19T02:10:28.097 に答える