Pregunta

Lo que hace la configuración de la primavera de las pruebas de integración parezca utilizando un h2 incrustado fuente de datos y, opcionalmente, JUnit?

Mi primer intento con un SingleConnectionDataSource básicamente trabajado, pero falló en las pruebas más complicadas en las que necesita varias conexiones al mismo tiempo o transacciones suspendidas. Creo que H2 en el modo de servidor TCP basado podría funcionar también, pero esto probablemente no es el modo de comunicación más rápido para una base de datos integrada temporal en la memoria.

¿Cuáles son las posibilidades y sus ventajas / desventajas? Además, ¿cómo crear las tablas / poblar la base de datos?


Actualización: Vamos a especificar algunos requisitos concretos que son importantes para este tipo de pruebas

.
  • La base de datos debe ser temporal y en la memoria
  • La conexión debe probablemente no utilizar TCP, por requisitos de velocidad
  • Sería bueno si pudiera utilizar una herramienta de base de datos para inspeccionar el contenido de la base de datos durante la depuración
  • Tenemos que definir un origen de datos ya que no podemos utilizar el origen de datos en servidores de aplicaciones de pruebas de unidad
¿Fue útil?

Solución

Con la reserva de que no sé si hay alguna herramienta que puede inspeccionar la base de datos, creo que una solución sencilla sería utilizar la base de datos incrustada primavera ( docs 3.1.x , documentos actuales ), que apoya HSQL, H2, y Derby.

El uso de H2, la configuración de XML se vería como la siguiente:

<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 prefiere configuración basada en Java, se puede crear una instancia de un DataSource como esto (tenga en cuenta que se extiende EmbeddedDataBase DataSource):

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

Las tablas de bases de datos son creados por el DB-schema.sql guión y se rellenan con los datos de prueba desde el db-test-data.sql guión.

No se olvide de agregar el controlador de base de datos de H2 a la ruta de clases.

Otros consejos

Actualmente incluyo en una prueba de sólo springconfig-archivo como un origen de datos:

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

La creación / eliminación de las tablas se puede hacer mediante el uso de executeSqlScript al redefinir AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction , o con SimpleJdbcTestUtils.executeSqlScript en un lugar apropiado.

este anuncio .

H2 está empaquetado con una aplicación incorporada de agrupación de conexiones. El siguiente XML proporciona un ejemplo de utilizarlo como un grano de origen de datos sin la necesidad de introducir dependencias adicionales en 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> 

La base de datos se cerrará llamando a un método dispose contexto de aplicación cuando se cierra la primavera.

Creo que lo mejor es usar su producción implementación de DataSource (sólo con conexión a diferentes cuerdas) de la unidad de pruebas.

De todos modos "fallaron en las pruebas más complicadas" no da suficiente información para una respuesta más detallada.

(Self-AD: comprobar esto )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top