43

組み込みの h2 データソースと、オプションで JUnitを使用した統合テスト用の Spring 構成はどのようになりますか?

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

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


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

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

4 に答える 4

51

データベースを検査できるツールがあるかどうかわからないので、簡単な解決策は、HSQL、H2、およびDerbyをサポートするSpring組み込みデータベース( 3.1.xドキュメント現在のドキュメント)を使用することだと思います。 。

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データベースドライバーをクラスパスに追加することを忘れないでください。

于 2012-02-07T06:13:09.407 に答える
19

私は現在、テスト専用の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をオーバーライドするときにexecuteSqlScriptを使用するか、適切な場所でSimpleJdbcTestUtils.executeSqlScriptを使用して実行できます。

この投稿も比較してください。

于 2010-01-07T10:22:53.330 に答える
10

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 メソッドを呼び出すことでデータベースがシャットダウンされます。

于 2012-10-19T20:09:51.760 に答える
0

単体テストには、本番用の DataSource 実装 (接続文字列が異なる場合のみ) を使用するのが最善だと思います。

とにかく、「より複雑なテストに失敗しました」では、より詳細な回答を得るのに十分な情報が得られません。

(自己広告 :これをチェックしてください)

于 2010-01-06T10:50:11.480 に答える