Frage

Wie sieht Ihre Spring-Konfiguration für Integrationstests aussehen wie mit einer eingebettet h2 Datenquelle und optional JUnit?

Mein erster Versuch mit einem TCP-basierten Server-Modus funktionieren könnte als gut, aber das ist wahrscheinlich nicht der schnellste Kommunikationsmodus für eine temporäre eingebettete Datenbank im Speicher.

Was sind die Möglichkeiten und ihre Vorteile / Nachteile? Auch, wie beurteilen Sie die Tabellen erstellen / füllen die Datenbank?


Update: Lassen Sie uns einige konkrete Anforderungen festlegen, die für solche Tests sind wichtig

.
  • Die Datenbank sollte nur vorübergehend sein und im Speicher
  • Die Verbindung sollte wahrscheinlich nicht tcp verwenden, für Geschwindigkeitsanforderungen
  • Es wäre schön, wenn ich ein Datenbank-Tool den Inhalt der Datenbank zu überprüfen während des Debuggen
  • verwenden könnte
  • Wir haben eine Datenquelle definieren, da wir nicht die Anwendungsserver-Datenquelle in Unit-Tests verwenden können,
War es hilfreich?

Lösung

Mit dem Vorbehalt, dass ich weiß nicht, ob es irgendein Werkzeug, das die Datenbank überprüfen kann, denke ich, dass eine einfache Lösung, um den Frühling eingebettete Datenbank zu verwenden ( 3.1.x docs , current docs ), die unterstützt HSQL, H2 und Derby.

Mit H2, Ihre XML-Konfiguration wie folgt aussehen:

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

Wenn Sie Java-basierte Konfiguration bevorzugen, können Sie ein DataSource wie folgt instanziiert (beachten Sie, dass EmbeddedDataBase erstreckt DataSource):

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

Die Datenbanktabellen werden durch das db-schema.sql Skript erstellt und sie bevölkert werden mit Testdaten aus dem db-Test-data.sql Skript.

Vergessen Sie nicht, die H2-Datenbank-Treiber auf Ihrem Classpath hinzuzufügen.

Andere Tipps

I sind derzeit in einer Test nur springconfig-Datei als Datenquelle:

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

Erstellen / Drop der Tabellen können mit executeSqlScript erfolgen, wenn zwingende AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction oder mit SimpleJdbcTestUtils.executeSqlScript in einer geeigneten Stelle.

Vergleich auch dieser Eintrag .

H2 ist mit einer eingebauten Anschluss Pool Umsetzung gebündelt. Die folgende XML stellt ein Beispiel für sie als Datenquelle Bohne mit ohne Notwendigkeit, zusätzliche Abhängigkeiten von DBCP oder C3P0 vorstellen:

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

Die Datenbank wird durch den Aufruf eine Methode Dispose heruntergefahren werden, wenn Spring-Anwendungskontext geschlossen wird.

Ich denke, es ist am besten, Ihre Produktion Datasource-Implementierung zu verwenden (nur mit unterschiedlichem Anschluss-String) für die Komponententests.

Wie auch immer „nicht bestanden auf kompliziertere Tests“ genug Informationen nicht für eine ausführlichere Antwort nicht geben.

(Selbst Anzeige: überprüfen Sie diese )

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top