Configuration du ressort pour la base de données H2 intégrée pour les essais

A quoi ressemble votre configuration de ressort pour les tests d'intégration en utilisant une source de données H2 intégrée et, optionnellement, JUnit?

Mon premier essai avec un SingleConnectionDataSource a essentiellement travaillé, mais a échoué sur les plus difficiles où vous avez besoin de plusieurs connexions en même temps ou de suspension des transactions. Je pense que h2 dans mode serveur basé sur tcp pourrait fonctionner aussi, mais c'est probablement pas le mode de communication le plus rapide pour une base de données temporaire intégrée en mémoire.

quelles sont les possibilités et leurs avantages / inconvénients? En outre, comment créer les tables / peupler la base de données?


mise à jour: précisons quelques exigences concrètes qui sont importantes pour de tels essais.

  • la base de données doit être temporaire et en mémoire
  • La connexion ne devrait probablement pas utiliser tcp, pour les exigences de vitesse
  • ce serait bien si je pouvais utiliser un outil de base de données pour inspecter le contenu de la base de données pendant le débogage
  • nous devons définir une source de données car nous ne pouvons pas utiliser la source de données des serveurs d'application dans les tests unitaires
39
demandé sur Community 2010-01-06 13:42:49

4 réponses

avec la réserve que je ne sais pas s'il y a un outil qui peut inspecter la base de données, je pense qu'une solution simple serait d'utiliser la base de données intégrée à ressort ( 3.1.x docs , current docs ) qui supporte HSQL, H2, et Derby.

en utilisant H2, votre configuration xml ressemblerait à ce qui suit:

<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>

si vous préférez une configuration basée sur Java, vous pouvez instancier un DataSource comme ceci (notez que EmbeddedDataBase s'étend DataSource ):

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

les tables de base de données sont créées par le db-schema.sql script et ils sont remplis avec des données de test du db-test-data.sql script.

n'oubliez pas d'ajouter le pilote de base de données H2 à votre classepath.

46
répondu matsev 2015-08-29 21:04:09

j'inclus actuellement dans un fichier springconfig de test seulement comme source de données:

<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>

créer / supprimer les tables peut être fait en utilisant executeSqlScript lors de la suppression de AbstractAnnotationAwareTransactionaltests.onSetUpBeforeTransaction , ou avec SimpleJdbcTestUtils.exécutesqlscript dans un endroit approprié.

Comparer cette publication .

18
répondu Hans-Peter Störr 2010-09-13 06:45:27

H2 est livré avec une implémentation de pool de connexion intégrée. Le XML suivant fournit un exemple de son utilisation comme source de données sans qu'il soit nécessaire d'introduire des dépendances supplémentaires sur DBCP ou C3P0:

<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> 

la base de données sera désactivée en appelant une méthode dispose lorsque le contexte de L'application du printemps se ferme.

8
répondu ejboy 2012-10-19 20:09:51

je pense qu'il est préférable d'utiliser l'implémentation de votre source de données de production (seulement avec une chaîne de connexion différente) pour les tests unitaires.

de toute façon "échoué à des tests plus compliqués" ne donne pas assez d'information pour une réponse plus détaillée.

(Auto-ad : cochez cette )

0
répondu Bozho 2010-01-06 11:39:57