unitarias pruebas prueba integracion unit-testing spring embedded-database h2

unit-testing - integracion - pruebas unitarias



ConfiguraciĆ³n de primavera para la base de datos H2 integrada para las pruebas (4)

¿Cómo se ve la configuración de Spring para las pruebas de integración utilizando un origen de datos h2 incrustado y, opcionalmente, JUnit?

Mi primer intento con SingleConnectionDataSource funcionó básicamente, pero falló en las pruebas más complicadas donde necesita varias conexiones al mismo tiempo o transacciones suspendidas. Creo que h2 en el modo de servidor basado en tcp podría funcionar también, pero probablemente este no sea el modo de comunicación más rápido para una base de datos incrustada temporal en la memoria.

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

Actualización: especifiquemos algunos requisitos concretos que son importantes para tales pruebas.

  • La base de datos debe ser temporal y estar en la memoria
  • La conexión probablemente no debería usar tcp, para 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 usar el origen de datos de los servidores de aplicaciones en pruebas unitarias

Actualmente incluyo en un archivo springconfig de solo prueba como fuente 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 executeSqlScript al reemplazar AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction , o con SimpleJdbcTestUtils.executeSqlScript en un lugar apropiado.

Compara también esta publicación .


Con la reserva de que no sé si hay alguna herramienta que pueda inspeccionar la base de datos, creo que una solución simple sería usar la base de datos integrada de Spring ( documentos 3.1.x , documentos actuales ) que admite HSQL, H2 y Derby. .

Usando H2, su configuración de xml sería similar a 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 la configuración basada en Java, puede instanciar un DataSource como este (tenga en cuenta que EmbeddedDataBase extiende 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 la base de datos las crea el script db-schema.sql y se completan con los datos de prueba del script db-test-data.sql .

No olvide agregar el controlador de base de datos H2 a su classpath.


Creo que es mejor utilizar su implementación DataSource de producción (solo con diferentes series de conexión) para las pruebas unitarias.

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

(Auto-anuncio: verifique esto )


H2 se incluye con una implementación de grupo de conexiones integrado. El siguiente XML proporciona un ejemplo de su uso como un bean Datasource 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 de eliminación cuando se cierre el contexto de la aplicación Spring.