J'essaie de faire des tests unitaires de mon DAO (en utilisant Spring et Hibernate). J'utilise HSQLDB par ce tutoriel. Le didacticiel indique que la base de données HSQLDB en mémoire peut être initialisée à l'aide d'un script SQL mais je ne trouve pas d'informations sur la façon de le faire dans Spring. Voici la configuration de contexte Spring pertinente:
<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:mydb" />
<property name="username" value="sa" />
<property name="password" value="" />
<property name="initialSize" value="5" />
<property name="maxActive" value="10" />
<property name="poolPreparedStatements" value="true" />
<property name="maxOpenPreparedStatements" value="10" />
</bean>
Toute aide serait appréciée. Merci.
Si vous essayez de travailler avec des bases de données en mémoire et Spring, il existe un nouvel espace de noms jdbc
pour Spring qui rend le travail avec les bases de données intégrées très facile.
La meilleure partie est qu'il agit comme un DataSource
, donc il peut facilement être déposé pour remplacer votre bean dataSource
existant.
<jdbc:embedded-database id="dataSource" type="HSQL">
<jdbc:script location="classpath:schema.sql"/>
<jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>
Si vous êtes plus intéressé à le faire avec Java Config, jetez un œil à EmbeddedDatabaseBuilder (nouveau dans Spring 3.0).
@Configuration
public class DatabaseTestConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:schema.sql")
.addScript("classpath:test-data.sql")
.build();
}
}
La réponse de Nicholas est parfaitement correcte, mais vous pouvez également utiliser jdbc
namespace pour initialiser la base de données externe:
<jee:jndi-lookup id="dataSource" jndi-name="Java:comp/env/jdbc/DS"/>
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:/META-INF/database/init.sql"/>
</jdbc:initialize-database>
Dans le didacticiel auquel vous accédez, l'une des façons de configurer les choses est la suivante (après une correction évidente):
- En mémoire à partir d'un script:
jdbc:hsqldb:file:path-to-file
Je pense que cela semble pertinent. Je suggère de remplacer path-to-file
avec quelque chose qui ressemble à un nom de fichier complet…
Vous pouvez contourner cela en créant une sous-classe de BasicDataSource
avec des getters/setters pour deux nouvelles propriétés, initExecuteSqlFile
et destroyExecuteSqlFile
, qui peuvent avoir un liste séparée par des virgules de fichiers SQL à exécuter. La sous-classe aurait des méthodes init()
et destroy()
qui gèrent les fichiers SQL init/destroy.
Utilisez ensuite la définition de bean suivante:
<bean
id="datasource"
class="com.example.MyBasicDataSource"
destroy-method="destroy"
init-method="init"
>
<property name="destroyExecuteSqlFile">
<value>h2-destroy-01.sql</value>
</property>
<property name="initExecuteSqlFile">
<value>h2-init-01.sql,h2-init-02.sql,h2-init-03.sql</value>
</property>
<!-- Other properties -->
</bean>
Avec la base de données intégrée, nous ne pourrions nous connecter à la base de données qu'à partir de la même machine virtuelle Java. Si nous avons deux JVM, pour les performances ou autres contraintes, nous pouvons:
Au lieu d'utiliser une base de données intégrée, vous pouvez utiliser la source de données suggérée dans cette réponse .
Ensuite, initialisez comme Poitrek De suggéré (et suggéré dans réponse précédente aussi). Vous pouvez créer des tableaux uniquement s'ils n'existent pas (comme suggéré ici ).