web-dev-qa-db-ja.com

すべてのテスト後にHSQLDBからデータを消去するにはどうすればよいですか?

私のプロジェクトには、セットアップメソッドでデータを入力するために使用されたJUnitテストがすでにいくつかありました。プロジェクトにmavenを追加しました。mavenからすべてのテストケース、つまりmvn testを実行します。問題は、すべてのテストクラスが実行された後、データベースがクリアされないことです。各クラスのテストケースが実行された後、HSQLDBをクリアする必要があります。

45
Robin
  1. スキーマを削除することにより、データを消去できます。デフォルトのスキーマはPUBLICと呼ばれます。以下のSQLステートメントを実行すると、すべてのデータがクリアされ、すべてのテーブルが削除されます。

    ドロップスキーマパブリックカスケード

  2. または、テーブルおよびスキーマオブジェクトの定義が必要な場合は、ファイルを作成できます。オブジェクトを含むがデータを含まないデータベースを作成し、以下のプロパティを.propertiesファイルに追加します。このタイプのデータベースをテストに使用すると、データへの変更は保持されません

    files_read_only = true

  3. HSQLDB 2.2.6以降で利用可能な最新の代替手段により、テーブルを保持したままスキーマ内のすべてのデータをクリアできます。以下の例では、PUBLICスキーマがクリアされます。

    スキーマの公開とコミットを打ち切る

    このステートメントは、HSQLDBの最新バージョンで強化されています。 http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement underTruncate Statement

79
fredt

fredt のアドバイスに従い、スキーマパブリックリスタートIDを切り捨て、チェックなしをコミットします。 DAOのJUnitテストのコードの関連部分。

@After
public void tearDown() {
    try {
        clearDatabase();
    } catch (Exception e) {
        fail(e.getMessage());
    }
}


public void clearDatabase() throws Exception {
  DataSource ds = (DataSource) SpringApplicationContext.getBean("mydataSource");
  Connection connection = null;
  try {
    connection = ds.getConnection();
    try {
      Statement stmt = connection.createStatement();
      try {
        stmt.execute("TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK");
        connection.commit();
      } finally {
        stmt.close();
      }
    } catch (SQLException e) {
        connection.rollback();
        throw new Exception(e);
    }
    } catch (SQLException e) {
        throw new Exception(e);
    } finally {
        if (connection != null) {
            connection.close();
        }
    }
}

http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement のドキュメントによると

RESTART IDENTITYが指定されている場合、スキーマ内のすべてのテーブルIDENTITYシーケンスとすべてのSEQUENCEオブジェクトは、開始値にリセットされます

19
user799188

すべてのテストで行うことは、実行の最後(すべてのアサーションが完了した後)でトランザクションをロールバックすることです。私たちはSpringを使用しており、デフォルトのテストは最後にはコミットしません。これにより、データベースの開始状態に常に戻ることが保証されます(エンティティテーブルの初期作成およびimport.sqlの実行後)。

Springを使用しない場合でも、おそらく独自のtry {} finally {}テストごとに開始されたトランザクションをロールバックするブロック。

9
Clement P

別の解決策は、「テスト間のデータベースのクリア」にリストされています http://www.objectpartners.com/2010/11/09/unit-testing-your-persistence-tier-code/

3
bharath

各テストの前に実行された簡単なSQLスクリプトがあり、最初に次のステートメントがありました。

TRUNCATE SCHEMA public AND COMMIT;

しかし、私はテスト間でロックの問題に遭遇し、これを追加すると魅力のように機能しました:

@After
public void after() throws Exception {
    if (entityManager.getTransaction().isActive()) {
        entityManager.getTransaction().rollback();
    }
}
2