La primavera di configurazione per sistemi embedded, H2 database per i test
-
19-09-2019 - |
Domanda
Che cosa fa la vostra Primavera di configurazione per i test di integrazione guardare come l'utilizzo di un embedded h2 datasource e, facoltativamente, JUnit?
Il mio primo tentativo con un SingleConnectionDataSource lavora principalmente, ma non è riuscito a test più complesse in cui avete bisogno di più connessioni contemporaneamente o sospeso le operazioni.Penso che in h2 basate su tcp server in modalità potrebbe funzionare, ma questo probabilmente non è il più veloce modalità di comunicazione per la temporanea database incorporato nella memoria.
Quali sono le possibilità e i vantaggi / svantaggi?Inoltre, come si fa a creare le tabelle / popolare il database?
Aggiornamento:Andiamo a specificare alcune esigenze concrete che sono importanti per questo tipo di test.
- Il database deve essere temporaneo e in memoria
- La connessione probabilmente non dovrebbe utilizzare il protocollo tcp, per i requisiti di velocità
- Sarebbe bello se potessi utilizzare uno strumento di database per ispezionare il contenuto del database durante il debug
- Dobbiamo definire un datasource dal momento che non siamo in grado di utilizzare l'applicazione server di origine unit test
Soluzione
Con la riserva che non so se c'è uno strumento che è possibile controllare il database, penso che una soluzione semplice sarebbe quella di utilizzare la Molla di database incorporato (3.1.x docs, corrente docs) che supporta HSQL, H2, e il Derby.
Utilizzando H2, xml di configurazione è il seguente:
<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>
Se si preferisce basato su Java di configurazione, è possibile creare un'istanza di un DataSource
come questo (si noti che EmbeddedDataBase
si estende DataSource
):
@Bean(destroyMethod = "shutdown")
public EmbeddedDatabase dataSource() {
return new EmbeddedDatabaseBuilder().
setType(EmbeddedDatabaseType.H2).
addScript("db-schema.sql").
addScript("db-test-data.sql").
build();
}
Le tabelle del database vengono creati da db-schema.sql script e sono popolati con i dati di prova dal db-test-dati.sql script.
Non dimenticate di aggiungere H2 database di driver per il tuo classpath.
Altri suggerimenti
Io al momento sono in un test-solo springconfig file di origine dati:
<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>
Creazione / eliminazione di tabelle può essere fatto utilizzando executeSqlScript quando si esegue l'override AbstractAnnotationAwareTransactionaltests.onSetUpBeforeTransaction, o con SimpleJdbcTestUtils.executeSqlScript in un luogo appropriato.
Confrontare anche questo post.
H2 viene fornito con un built-in connessione piscina attuazione.Il seguente codice XML fornisce un esempio di utilizzo come Datasource bean, senza la necessità di introdurre ulteriori dipendenze DBCP o 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>
Il database verrà arrestato chiamando un metodo dispose quando la Primavera contesto di applicazione si chiude.
Penso che la cosa migliore è usare la vostra produzione DataSource attuazione (solo con diverse stringa di connessione) per l'unità-test.
Comunque "non riuscita nel test più complesse" non dare abbastanza informazioni per una risposta più dettagliata.
(Self-annuncio : controllare questo)