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
È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top