Question

Qu'est-ce que la configuration de printemps pour les tests d'intégration ressembler à l'aide d'un intégré h2 datasource et, facultativement, JUnit?

Mon premier essai avec un tcp pourrait travailler ainsi, mais cela est probablement pas le mode de communication le plus rapide pour une base de données intégrée temporaire dans la mémoire.

Quelles sont les possibilités et leurs avantages / inconvénients? En outre, comment voulez-vous créer les tables / remplir la base de données?


Mise à jour: Précisons certaines exigences concrètes qui sont importants pour ces tests

.
  • La base de données devrait être temporaire et en mémoire
  • La connexion ne devrait probablement pas utiliser tcp, pour les besoins 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 puisque nous ne pouvons pas utiliser les serveurs d'application dans les tests de source de données unitaires
Était-ce utile?

La solution

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 Spring ( 3.1.x docs , docs en cours ) qui soutient HSQL, H2 et Derby.

Utilisation de H2, la configuration xml se présente comme 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 la configuration basée sur Java, vous pouvez instancier un DataSource comme celui-ci (notez que EmbeddedDataBase é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éés par db-schema.sql scénario et ils sont remplis avec des données de test de la db-test data.sql script.

Ne pas oublier d'ajouter le pilote de base de données H2 à votre classpath.

Autres conseils

Je figurent actuellement en test uniquement springconfig fichier 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 peuvent être faites en utilisant executeSqlScript lors de la substitution AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction , ou SimpleJdbcTestUtils.executeSqlScript dans un endroit approprié.

Comparez aussi ce affichage.

H2 est livré avec une implémentation pool de connexion intégré. Le code XML suivant fournit un exemple de l'utiliser comme un grain de DataSource sans nécessité 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 fermé en appelant une méthode de Éliminez lorsque le contexte d'application Spring ferme.

Je pense qu'il est préférable d'utiliser votre production mise en œuvre de DataSource (uniquement avec différent chaîne de connexion) pour les tests unitaires.

En tout cas « a échoué sur des tests plus compliqués » ne donne pas assez d'informations pour une réponse plus détaillée.

(auto-annonce: vérifier )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top