web-dev-qa-db-ja.com

DBUnitが自動的にテーブルを作成する方法はありますか?

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

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

EDIT: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";
}
23
neu242

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

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

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

16
tpdi

いいえ。のテーブル定義を使用してSQLスクリプトを実行する必要があります。

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

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

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

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

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

3
Asa

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

例えば。 hibernateの場合、プロパティhibernate.hbm2ddl.autoを指定し、その値をcreate-dropに設定します(テストには問題ありません)。

参照: Hibernateドキュメント、第3章構成

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

2
Martin Klinke

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

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

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

0
Joshua W