私のプロジェクトには、セットアップメソッドでデータを入力するために使用されたJUnitテストがすでにいくつかありました。プロジェクトにmavenを追加しました。mavenからすべてのテストケース、つまりmvn testを実行します。問題は、すべてのテストクラスが実行された後、データベースがクリアされないことです。各クラスのテストケースが実行された後、HSQLDBをクリアする必要があります。
スキーマを削除することにより、データを消去できます。デフォルトのスキーマはPUBLICと呼ばれます。以下のSQLステートメントを実行すると、すべてのデータがクリアされ、すべてのテーブルが削除されます。
ドロップスキーマパブリックカスケード
または、テーブルおよびスキーマオブジェクトの定義が必要な場合は、ファイルを作成できます。オブジェクトを含むがデータを含まないデータベースを作成し、以下のプロパティを.propertiesファイルに追加します。このタイプのデータベースをテストに使用すると、データへの変更は保持されません
files_read_only = true
HSQLDB 2.2.6以降で利用可能な最新の代替手段により、テーブルを保持したままスキーマ内のすべてのデータをクリアできます。以下の例では、PUBLICスキーマがクリアされます。
スキーマの公開とコミットを打ち切る
このステートメントは、HSQLDBの最新バージョンで強化されています。 http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement underTruncate Statement
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オブジェクトは、開始値にリセットされます
すべてのテストで行うことは、実行の最後(すべてのアサーションが完了した後)でトランザクションをロールバックすることです。私たちはSpringを使用しており、デフォルトのテストは最後にはコミットしません。これにより、データベースの開始状態に常に戻ることが保証されます(エンティティテーブルの初期作成およびimport.sqlの実行後)。
Springを使用しない場合でも、おそらく独自のtry {} finally {}
テストごとに開始されたトランザクションをロールバックするブロック。
別の解決策は、「テスト間のデータベースのクリア」にリストされています http://www.objectpartners.com/2010/11/09/unit-testing-your-persistence-tier-code/
各テストの前に実行された簡単なSQLスクリプトがあり、最初に次のステートメントがありました。
TRUNCATE SCHEMA public AND COMMIT;
しかし、私はテスト間でロックの問題に遭遇し、これを追加すると魅力のように機能しました:
@After
public void after() throws Exception {
if (entityManager.getTransaction().isActive()) {
entityManager.getTransaction().rollback();
}
}