Grails: Ejecutar script de h2 en pruebas


Grails es un excelente framework web. En entornos de prueba usa H2 (desde la versión 2.0) o HSQLDB (en las versiones 1.3.x) como motores de base de datos en memoria para pruebas. Ahora bien, con un modelo de dominio que usa una tabla en un esquema propio:

class TestDomain {

	Date dateCreated
	Date lastUpdated
	Long budget
	
	static mapping = {
		table schema:"my_schema"
	}
}

no se puede confiar en el hbm2ddl para crear el esquema “my_schema”, para solucionar esto es posible usar la capacidad de H2 de ejecutar un script una vez se crea la base (en DataSource.groovy):

test {
        dataSource {
			pooled = false
            dbCreate = "update"
            url = "jdbc:h2:mem:testDb;MVCC=TRUE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS my_schema"
        }
    }

Sin embargo se ve algo feo y no es muy extensible (generalmente se tienen varios esquemas de base de datos) así que lo mejor es usar un archivo sql, pero (siempre hay uno) la versión que viene con grails 2.0 no soporta esta característica, H2 incorporó la capacidad de ejecutar archivos con rutas relativas desde la versión 1.3.150 Beta (2011-01-28) (Mejorado en la versión 1.3.154 (2011-04-04)) así que es necesario sobreescribir la dependencia en BuildConfig.groovy:

dependencies {
        // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.

        // runtime 'mysql:mysql-connector-java:5.1.16'
		test 'com.h2database:h2:1.3.160'
    }

De esa manera podemos incluir un archivo sql en src/java y usarlo en la inicialización de la base de datos de pruebas:

test {
        dataSource {
			pooled = false
            dbCreate = "update"
            url = "jdbc:h2:mem:testDb;MVCC=TRUE;MODE=PostgreSQL;INIT=RUNSCRIPT FROM 'classpath:create-schemas.sql'"
        }
    }

Disclaimer: Este post está basado en la solución de JAKUB NABRDALIK

Acerca de Nickman

Aunque crítico e Ingeniero (especializado en software), piloto de aeroplano soy (seré).

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s