web-dev-qa-db-ja.com

テスト用の組み込みH2データベースのSpring構成

embedded h2 datasource およびオプションでJUnitを使用した統合テストのSpring構成はどのように見えますか?

最初に SingleConnectionDataSource を試してみましたが、基本的には機能しましたが、同時に複数の接続が必要な場合やトランザクションを中断する必要があるより複雑なテストでは失敗しました。 tcpベースのサーバーモード のh2も同様に機能すると思いますが、これはおそらくメモリ内の一時的な組み込みデータベースの最速の通信モードではありません。

可能性とその利点/欠点は何ですか?また、テーブルをどのように作成し、データベースに入力しますか?


更新:そのようなテストに重要ないくつかの具体的な要件を指定しましょう。

  • データベースは一時的であり、メモリ内にある必要があります
  • 接続には、おそらく速度要件のためにtcpを使用しないでください。
  • デバッグ中にデータベースツールを使用してデータベースの内容を検査できたらいいですね。
  • ユニットテストではアプリケーションサーバーのデータソースを使用できないため、データソースを定義する必要があります
40

データベースを検査できるツールがあるかどうかはわかりませんが、単純な解決策はSpring組み込みデータベース( .1.x docs現在のドキュメント )HSQL、H2、およびDerbyをサポートしています。

H2を使用すると、xml構成は次のようになります。

<jdbc:embedded-database id="dataSource" type="H2">
    <jdbc:script location="classpath:db-schema.sql"/>
    <jdbc:script location="classpath:db-test-data.sql"/>
</jdbc:embedded-database>

Javaベースの構成を好む場合、次のようにDataSourceをインスタンス化できます(EmbeddedDataBaseDataSourceを拡張することに注意してください):

@Bean(destroyMethod = "shutdown")
public EmbeddedDatabase dataSource() {
    return new EmbeddedDatabaseBuilder().
            setType(EmbeddedDatabaseType.H2).
            addScript("db-schema.sql").
            addScript("db-test-data.sql").
            build();
}

データベーステーブルはdb-schema.sqlスクリプトによって作成され、dbからのテストデータが入力されます。 -test-data.sqlスクリプト。

H2データベースドライバーをクラスパスに追加することを忘れないでください。

48
matsev

現在、テスト専用のspringconfig-fileにデータソースとして含めています。

<bean id="database.dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <constructor-arg>
        <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
            <property name="driverClass" value="org.h2.Driver" />
            <property name="url"
                value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2" />
        </bean>
    </constructor-arg>
</bean>

<!-- provides a H2 console to look into the db if necessary -->
<bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server" 
    factory-method="createWebServer" depends-on="database.dataSource" 
    init-method="start" lazy-init="false">
    <constructor-arg value="-web,-webPort,11111" />
</bean>

AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction をオーバーライドするとき、または適切な場所で SimpleJdbcTestUtils.executeSqlScript をオーバーライドするときに、executeSqlScriptを使用して、テーブルの作成/ドロップを行うことができます。

比較も この投稿

18

H2は、組み込みの接続プール実装にバンドルされています。次のXMLは、DBCPまたはC3P0に追加の依存関係を導入することなく、Datasource Beanとして使用する例を示しています。

<bean id="dataSource" class="org.h2.jdbcx.JdbcConnectionPool" destroy-method="dispose">
    <constructor-arg>
        <bean class="org.h2.jdbcx.JdbcDataSource">
            <property name="URL" value="jdbc:h2:dbname"/>
            <property name="user" value="user"/>
            <property name="password" value="password"/>
         </bean>
    </constructor-arg>
</bean> 

データベースは、Springアプリケーションコンテキストが閉じるときにdisposeメソッドを呼び出すことによりシャットダウンされます。

9
ejboy

ユニットテストには、実動DataSource実装(異なる接続文字列のみ)を使用するのが最善だと思います。

とにかく「より複雑なテストで失敗した」ということは、より詳細な答えを得るための十分な情報を提供しません。

(セルフ広告: チェックしてください

0
Bozho