2012-01-03 20 views
2

タイトルによれば、データベースを「既知の状態」にして単体テストを適用したいのです。私は落とすことができます - ユニットテストを実行する前に毎回私のデータベースを再作成しますが、より良い方法がありますか?Spring Web Unitテスト - データベースを既知の状態にする方法?

私のWebアプリケーションは現在、Springコンテキスト& Hibernateで動作します。

答えて

3

DBUnitというツールを使用することをお勧めします。これは、探しているものとまったく同じように設計されています。 Web上には、Springで使用している多くの例があります。& Hibernate

データをロードするには:

@Before 
public void onSetUpInTransaction() throws Exception { 
    Connection conn = dataSource.getConnection(); 
    try { 
     IDatabaseConnection connection = new DatabaseConnection(conn); 
     DatabaseConfig config = connection.getConfig(); 
     config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, 
       new HsqldbDataTypeFactory()); 
        DataFileLoader loader = new FlatXmlDataFileLoader(); 
      IDataSet ds = loader.load(TEST_DATA_FILE_CLUB); 
        DatabaseOperation.CLEAN_INSERT.execute(connection,ds); 
      } finally { 
     DataSourceUtils.releaseConnection(conn, dataSource); 
    } 
} 

これはTEST_DATA_FILE_CLUB文字列で参照されるXMLファイルを取得し、データベースのクリーンメモリ内のコピーにそれをロードします。

クリーンダウンするには、@Afterで注釈を付けた別の方法を使用し、代わりにDELETE_ALLデータベース操作を使用します。

あなたがJUnitを使用していると仮定して、これらのメソッドをテストクラスまたはテストクラスが拡張できるスーパークラスに配置すると、個々のテストごとに望み通りにスピーディにデータベースをセットアップできます。ロードする

XMLファイルは単純である:指定され

<?xml version="1.0" encoding="UTF-8"?> 
<dataset> 
    <competition competitionId="1" competitionName="Competition 1" 
     senior="1" junior="0"/> 
</dataset> 

は、列の値と、競合テーブルに行をロードします。上級の&ジュニアカラムはブール値です。

+0

以前私はDBUnitについて知っていましたが、まったく新しいフレームワークを学ぶにはそれほど価値があるかどうかはわかりません。 DBUnitは私にとっては大きすぎると思われる –

+0

これは本当に難しいことではありません。テスト用にメモリ内のデータベースを使用しているため、高速です。各テストでd/bをクリーンな状態にリロードするだけです。私は上記の答えにいくつかのコードを追加します – TrueDub

+0

ありがとう、私は正常にメモリ内のデータベースをセットアップしたが、DBUnitを設定する方法が少し不明な感じ。あなたは私にいくつかのリソースを指してもらえますか? –

1

何らかの統合テストを行っている場合は、他のテストが失敗しても問題なく機能するようにテストを実行してみてください。

その後、ところで(最初のテストの前に)一度だけのセットアップに

をデータベースが必要:私は強く異なるデータベース(開発用)のみのテストのために使用されているものを使用することをお勧めします。

その他の技術的な詳細:あなたは本当の(大きな)統合テストのための春のJDBCサポート

<jdbc:embedded-database id="dataSource" type="H2" > 
    <jdbc:script location="classpath:init.sql" />  
</jdbc:embedded-database> 
  • を使用することができ、中小のテストのためのinmemmory DBを使用する場合 *、あなたはMavenを使用することができsql-maven-plugin
+0

これはダンプに関する質問ですが、簡単にデータベース間を切り替える方法はありますか?私は現在、環境に応じて変更するJVM設定変数を設定していますが、テストを実行するたびに再設定する必要があります。 –

+0

それはあなたの設定に強く依存します。私は個人的にJNDIを使います。私はデベロップメントサーバー(私のecliseのtomcat)を持っています。ここでは、JNDIソースは1つのDBを指していて、もう1つは統合テストをdireclyで(テストを開発するために)実行します。それから、私はJNDIのソースが3.DBを指しているmavenによって設定されている3. tomcatを持っています。 - 別のTomcatインスタンスがあり、それぞれがDB接続に同じJNDI名を使用していますが、接続が異なるDBを指しています – Ralph

+0

複雑に聞こえます。開発用サーバーとしてEclipseに統合されたTomcatは1つだけです。あなたはそのような環境を設定する方法に関する文書を知っていますか? –

関連する問題