2009-09-17 14 views
10

Webアプリケーションを作成していますが、初期データを入力することをお勧めします。これはJPA/HibernateとSpringアプリケーションであり、mavenによって構築されています。これまでは、手動で開始した初期データをデータベースに取り込むスクリプトを使用しました。
ユニットテストは、各テストの前にコードで作成された独自のデータで動作します。私のテストクラスは、org.springframework.test.jpa.AbstractJpaTestsまで拡張されています。
最後に、データベースフォームエンティティを作成するmavenビルドを作成したいと思います(データベースを作成してスクリプトを実行する必要があります)。次に初期/辞書データを入力し、ユニットと統合テストを実行します。このプロセスは完全にCIサーバー(ハドソン)でこのビルドを置くために自動化する必要があります、最初から新しいデータベースを作っても感謝しています。Webアプリケーションに初期データを設定する方法


追加要件:データベースに依存しないソリューションが最も価値があります。

編集:私が探しているベストの例はinit closure in BootStrap.groovyです。

答えて

6

EDIT:SpringとDbUnitでHibernate JPAをテストする方法を示すブログ記事へのリンクを追加しました。

[...]私は役立つかもしれないhibernate3:hbm2ddl目標とmaven hibernate3 pluginがあり、エンティティ

からデータベースを作成するMavenのビルドを持っているしたいと思います。 maven sql pluginと組み合わせて、生成されたDDLからこのスキーマを作成することが可能でなければなりません。

は、[...]そして、初期/辞書データ

を移入再度、maven sql pluginはここで仕事をすることができます。またはDBUnitでもう1つの洗練された解決策です(を参照)。

を実行し、ユニットと統合テストを実行します。

私はあなたの単体テストがデータベースにアクセスする必要があるとは確信していませんが、統合テストでは、私が言ったようにDBUnitをチェックしてください。これは実際には、データベースを既知の状態にセットアップし、テスト実行後に期待されるコンテンツのテーブルをテストし、データベースを初期状態に戻すことができる非常に優れたツールです。良い例は、Testing JPA Hibernate with Spring & DbUnitを参照してください。

このプロセスは、このビルドをCIサーバー(hudson)に入れるために完全に自動化されている必要があります。

これは実現可能です。

+0

ユニットテストでUnitilsを使用することを検討します。スクリプト/ xmlファイルで初期データを定義し、javaに読み込んでJPA/Hibernateを使用してデータベースに依存しない方法でパースする方法があるのだろうかと思います。 – cetnar

+0

JPUに基づいていない点を除いて、DBUnitを確認してください。 DBunitとそのAPIを使用すると、xml/csvの初期データと期待データを定義し、ユニットテストからデータをロードし、テーブルの内容をアサートして、初期状態のデータベースを復元することができます。 DBUnitとUnitilsの統合があります(http://www.unitils.org/apidocs/org/unitils/dbunit/package-summary.htmlを参照) –

0

IそしてIは、テスト時(私はHSQLDBを使用)データベースを作成するためのHibernate3-のmaven-プラグインを使用

org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests

を拡張することによって、あなたとほぼ同じ問題を解決:

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>hibernate3-maven-plugin</artifactId> 
      <version>2.1</version> 
      <configuration> 
       <components> 
        <component> 
         <name>hbm2ddl</name> 
         <implementation>jpaconfiguration</implementation> 
        </component> 
       </components> 
       <componentProperties> 
        <drop>true</drop> 
        <jdk5>true</jdk5> 
        <propertyfile>target/classes/jdbc.properties</propertyfile> 
        <skip>${maven.test.skip}</skip> 
       </componentProperties> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>process-test-resources</phase> 
        <goals> 
         <goal>hbm2ddl</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>${jdbc.groupId}</groupId> 
        <artifactId>${jdbc.artifactId}</artifactId> 
        <version>${jdbc.version}</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

私はsimple maven projectをGoogle Codeに掲載し、この技術を実証しました。

+0

なぜDbUnitを使用しないのですか? –

+0

DBUnitを使用しないという技術的な理由はありません。私はちょうどそれを使用していない。私はそれを見て、サンプルプロジェクトを適切に更新します。 この時点までに、コードでテストデータを作成しました。これはサンプルプロジェクトでは合理的ですが、実際のコードをテストする場合は、DBUnitなどのソリューションが必要になります。提案ありがとう。 –

1

@David、あなたのポストに感謝します。初期データを作成する唯一の妥当な解決策は、あなたのものと似ています。つまり、データをテストに挿入することです。私のコードでは、hibernate3-maven-pluginを使用しない場合もあります。私はオーバーライドされたメソッド

org.springframework.test.jpa.AbstractJpaTestsを使用書いたように

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="jpaVendorAdapter"> 
    <bean 
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="showSql" value="true" /> 
     <property name="generateDdl" value="true" /> 
     <property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect"/> 
    </bean> 
</property> 
<property name="dataSource" ref="dataSource"/> 

jpaContext.xmlファイルに春で行わにおけるデータベースの作成

 @Override protected String[] getConfigLocations() { return new String[]{ "classpath:/jpaContext.xml"}; } 

私はそれが単純化あなたの解決策。私はまだ初期データを作成するためのより良い解決策を探しています。手でたくさんの関係を持つオブジェクトを作成するのは面倒です。

+0

DbUnitに対する否定的なフィードバック(私の答えやコメントを読んでいるかどうか疑問に思っています)? –

+0

@Pascal。なぜ否定的なのか? :)私はあなたのコメント/答えを読む。私にとって最も簡単な解決策は、JPA/Hibernateの方法でチューニング(私はまだ調べています)です。 Unitils/DBUnitは別の良いオプションですが、もう1つです。 – cetnar

関連する問題