web-dev-qa-db-ja.com

Spring / Hibernateテスト:DDL作成後にテストデータを挿入する

インメモリHSQLデータベースで実行されるいくつかの統合テストを備えたSpring/HibernateWebアプリがあります。 Hibernateはこの空白のデータベースを取得し、hbm2ddl = createのおかげですべてのテストテーブルと制約を作成します。ただし、afterPropertiesSet()メソッド中にデータベースから特定の構成値をチェックする新しいBeanがあるため、このBeanが初期化されるとき、そのような行はデータベースに存在する必要があります。

Railのテストフィクスチャと同等のJava/Spring/Hibernateをセットアップする良い方法はありますか? 「このテーブルを作成するときはいつでも、直後にこれらの行を挿入する」ことをHibernateに伝える方法を見つけようとしています。追加できるコールバックやフックが見つかりませんでしたが、別の方法があるかもしれません。

17

「このテーブルを作成するときはいつでも、すぐにこれらの行を挿入する」ことをHibernateに伝える方法を見つけようとしています。

Hibernate 3.1以降、Hibernateのランタイムクラスパスにimport.sqlというファイルを含めることができ、スキーマのエクスポート時に、Hibernateはスキーマのエクスポート後にそのファイルに含まれるSQLステートメントを実行します。

この機能は ロッテルダムJBugとHibernateのimport.sql ブログ投稿で発表されました:

import.sql:ユニットテストでデータを簡単にインポートできます

Hibernateには、文書化が大幅に不足していて不明な、きちんとした小さな機能があります。データベーススキーマ生成直後のSessionFactory作成中にSQLスクリプトを実行して、新しいデータベースにデータをインポートできます。クラスパスルートにimport.sqlという名前のファイルを追加し、create-dropプロパティとしてcreateまたはhibernate.hbm2ddl.autoのいずれかを設定する必要があります。

クエリの章を開始したので、Hibernate Search inActionに使用します。単体テスト用の新しいデータセットでデータベースを初期化します。 JBoss Seamは、さまざまな例でもこれを頻繁に使用します。 import.sqlは非常に単純な機能ですが、非常に便利です。 SQLはデータベースに依存している可能性があることに注意してください(移植性があります!)。

#import.sql file
delete from PRODUCTS
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair blah blah...');
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('2', 'B00003CXCD', 'Roman Holiday ', 12.98, 'B00003CXCD.jpg', 'We could argue that blah blah');

この機能の詳細については、チェックしてください Eyalのブログ 、彼はそれについての素敵な小さなエントリを書きました。データベースオブジェクト(インデックス、テーブルなど)を追加する場合は、補助データベースオブジェクト機能を使用することもできます。

それはまだ実際には文書化されていません。

27
Pascal Thivent

Hibernate 3.6では、任意のSQLコマンドを実行できるようにする構成は次のとおりです。

hibernate.hbm2ddl.import_files

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/ を参照してください。ドキュメントにエラーがあることに注意してください。プロパティはimport_filesであり、最後にs。

6
mmalmeida

JUnitテストについて話していて、 AbstractTransactionalDataSourceSpringContextTests を使用している場合は、 onSetupBeforeTransaction のようにオーバーライドできるメソッドがあり、テストテーブルデータなどを事前入力するためのフックを提供します。

1
brabster