23

DBUnitがそれ自体でテーブルを作成しないことに気づきました(NoSuchTableExceptionに直面せずにプレーンJDBCおよびHSQLDBを使用してDBUnitでテストするにはどうすればよいですか?を参照)。

DBUnitがデータセットまたはdtdからテーブルを自動的に作成する方法はありますか?

編集: HSQLDBのようなインメモリデータベースの簡単なテストでは、大まかなアプローチを使用してテーブルを自動的に作成できます。

private void createHsqldbTables(IDataSet dataSet, Connection connection) throws DataSetException, SQLException {
    String[] tableNames = dataSet.getTableNames();

    String sql = "";
    for (String tableName : tableNames) {
      ITable table = dataSet.getTable(tableName);
      ITableMetaData metadata = table.getTableMetaData();
      Column[] columns = metadata.getColumns();

      sql += "create table " + tableName + "( ";
      boolean first = true;
      for (Column column : columns) {
        if (!first) {
          sql += ", ";
        }
        String columnName = column.getColumnName();
        String type = resolveType((String) table.getValue(0, columnName));
        sql += columnName + " " + type;
        if (first) {
          sql += " primary key";
          first = false;
        }
      }
      sql += "); ";
    }
    PreparedStatement pp = connection.prepareStatement(sql);
    pp.executeUpdate();
}

private String resolveType(String str) {
  try {
    if (new Double(str).toString().equals(str)) {
      return "double";
    }
    if (new Integer(str).toString().equals(str)) {
      return "int";
    }
  } catch (Exception e) {}

  return "varchar";
}
4

5 に答える 5

16

あまり。リンクした回答が指摘しているように、dbunit xml ファイルにはデータが含まれていますが、列の型は含まれていません。

そして、あなたは本当にこれをしたくありません。テスト アーティファクトでデータベースを汚染するリスクがあり、本番コードがテスト プロセスによって作成されたテーブルに誤って依存する可能性が生じます。

これを行う必要があるということは、データベースの作成と保守のプロセスが適切に定義され、スクリプト化されていないことを強く示唆しています。

于 2009-10-07T12:34:34.200 に答える
4

いいえ。テーブル定義を含む SQL スクリプトを実行する必要があります。

他のスレッドに投稿したように、XML にはテーブルを作成するのに十分なデータが含まれていません。値を解析して、含まれている値を見つけようとするような恐ろしいことを行うことができると思いますが、それは非常に脆弱です。これは、アノテーション付きクラスにはデータベースの外観に関する多くの情報が含まれているという点で、Hibernate とは異なります。注釈の一部と Java 型フィールドの一部があります。

http://www.dbunit.org/faq.html#ddl

于 2009-10-07T12:30:41.590 に答える
3

Spring Boot/Spring JDBC は、プレーンな JDBC でデータベースを初期化できます。

Spring JDBC には DataSource 初期化機能があります。Spring Boot はデフォルトでこれを有効にし、標準の場所schema.sqldata.sql(クラスパスのルート) から SQL をロードします。さらに、Spring Boot はschema-${platform}.sqlおよびdata-${platform}.sqlファイル (存在する場合) をロードします。ここで platform は の値ですspring.datasource.platform。たとえば、データベースのベンダー名 (hsqldb、h2、oracle、mysql、postgresql など) に設定することを選択できます。

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

于 2016-05-03T11:34:28.897 に答える
2

JPA を使用している場合は、通常、初期化時にテーブルを作成/更新するように JPA プロバイダーを構成できます。

たとえば、休止状態の場合、プロパティhibernate.hbm2ddl.autoを指定し、その値を create-drop に設定します (テストには問題ないはずです)。

参照: Hibernate のドキュメント、第 3 章設定

ただし、JPA プロバイダーが DB に最初にアクセスすることを確認してください ;)

于 2009-10-18T20:11:39.003 に答える
0

私はただチャイムを鳴らして、これが私にとって非常に役に立ったと言いたかった. Oracle データベースに接続して XML ファイルにエクスポートし、それをテスト HSQL データベースとしてインポートして、Hibernate でアクセスする必要がありました。実行する前に、このコードを使用してテーブルを作成しました

DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);. 

ただし、このコードは各テーブルの最初の列を主キーとして設定するため、インポート時に「主キー制約違反」が発生する可能性があるため、関係テーブルを使用する場合は注意してください。コードスニペットをありがとう!

于 2011-03-18T14:29:39.447 に答える