2010-02-17 6 views
6

Tengo una colección de pruebas de integración que Spring Roo ha generado para mis objetos de dominio (y DAO ITD).¿Cómo ejecutar las pruebas generadas por Spring Roo en una base de datos diferente a Tomcat?

que parecen ser fijado a utilizar la "producción" applicationContext.xml, que lee los database.properties y se conecta con el esquema de base de datos MySQL que he creado para experimentar con el proyecto:

privileged aspect AdvertIntegrationTest_Roo_IntegrationTest { 

    declare @type: AdvertIntegrationTest: @RunWith 
     (SpringJUnit4ClassRunner.class);  

    declare @type: AdvertIntegrationTest: @ContextConfiguration 
     (locations = "classpath:/META-INF/spring/applicationContext.xml"); 

El El resultado de esto es que mi base de datos de demostración con frecuencia se llena de basura con estas pruebas.

Me gustaría cambiar la configuración para que las pruebas de integración utilicen una base de datos interna y dejen la base de datos MySQL bien aislada. Por el momento, la única opción que puedo ver es eliminar las anotaciones de Roo y administrar estas pruebas a partir de ahora, pero prefiero mantener a Roo al tanto en este momento.

¿Es posible configurar mi proyecto, por lo que los comandos "mvn tomcat" y "mvn test" utilizan bases de datos separadas, sin romper la configuración de Spring Roo? ¿O tal vez hay un mejor enfoque para lo que quiero hacer?

+0

Actualización: Tengo un poco de ayuda de Ben Alex en los foros de primavera (http://forum.springsource.org/showthread.php?p=284703#post284703), parece que la Spring Roo aún no ofrece cualquier soporte integrado para esto ... – seanhodges

Respuesta

6

Sean,

He luchado con la misma cosa. Me acabó poniendo una copia de applicationContext.xml en test/resources/META-INF/muelle y la modificación de la línea de abajo:

<context:property-placeholder location="classpath*:META-INF/spring/test/*.properties"/> 

En ese directorio 'prueba' los puntos de propiedad del titular lugar a, he dicho de otra database.properties que configura hsqldb.

último, que tenía que tener una copia diferente de persistence.xml que configura el lenguaje SQL (también en applicationContext.xml)

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-for-tests.xml"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

supongo que una solución más elegante a través del uso de la magia pom.xml es posible, pero por ahora esto me pareció una solución aceptable.

Hans

+0

he votado a favor del problema jira :) –

+0

Esto es muy útil, ¡gracias! ¿Cómo instruyó a las pruebas de Roo para usar la "prueba" applicationContext.xml? ¿Modificó los archivos AJ generados? – seanhodges

+0

no, no modifiqué ningún archivo aj, esto no es obligatorio ni recomendable, ya que se crean/administran exclusivamente por roo. Roo aplaza la ejecución de prueba a maven. maven simplemente recogerá los archivos de configuración que viven en test/resources y, por lo tanto, están en classpath. –

1

Sean, todo

Yo tenía el mismo problema y encontrar una cosa más que podría ser útil para todos. En una persistence.xml pueden definir varias persistencia unidades con diferentes nombres como:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <!-- production persistence unit --> 
    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    ... 
    </persistence-unit> 
    <!-- test persistence unit --> 
    <persistence-unit name="testPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    ... 
    </persistence-unit> 
    </persistence> 

Luego, en su applicationContext.xml (esto es para pruebas) sólo son necesarios 2 cambios:

  1. propiedades archivos se cargan los puntos de forma/primavera-test META-INF/*

    <context:property-placeholder location="classpath*:META-INF/spring-test/*.properties"/> 
    
  2. persistenceUnitName a "testPersistenceUnit" en la persistencia.xml

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="persistenceUnitName" value="testPersistenceUnit"/> 
    <property name="dataSource" ref="dataSource"/> 
    

Esperamos que esto ayude a alguien, ya que hay muchas respuestas allí, pero es difícil averiguar que puede haber múltiples persistenceUnits definido en una persistence.xml

Szymon

0

Para mí estos pasos funcionaron bien:

1) Añadir una nueva unidad de persistencia en su src/main/resources/META-INF/persistence.xml para su propósito de la prueba:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <!-- Production Database --> 
    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> 
     <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database --> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
     <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> 
     <property name="hibernate.connection.charSet" value="UTF-8" /> 
     <!-- Uncomment the following two properties for JBoss only --> 
     <!-- property name="hibernate.validator.apply_to_ddl" value="false" /--> 
     <!-- property name="hibernate.validator.autoregister_listeners" value="false" /--> 
     </properties> 
    </persistence-unit> 

    <!-- Test Database --> 
    <persistence-unit name="persistenceUnitTest" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> 
     <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database --> 
     <property name="hibernate.hbm2ddl.auto" value="create" /> 
     <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> 
     <property name="hibernate.connection.charSet" value="UTF-8" /> 
     <!-- Uncomment the following two properties for JBoss only --> 
     <!-- property name="hibernate.validator.apply_to_ddl" value="false" /--> 
     <!-- property name="hibernate.validator.autoregister_listeners" value="false" /--> 
     </properties> 
    </persistence-unit> 
</persistence> 

2) copiar los archivos applicationContext.xml y database.propertiessrc/main/resources/META-INF/spring-src/test/resources/META-INF/spring (si esta carpeta no existe crearlo).

3) Reemplazar el contenido de la src/test/resources/META-INF/spring/database.properties en algo como esto:

#Updated at Sat Sep 12 22:13:10 CEST 2015 
#Sat Sep 12 22:13:10 CEST 2015 
database.test.driverClassName=org.h2.Driver 
database.test.url=jdbc:h2:./src/test/resources/db/data 
database.test.username=sa 
database.test.password= 

4) Cambie el nombre del archivo src/test/resources/META-INF/spring/applicationContext.xmlapplicationContext.xml-testApplicationContext.xml y cambiar su contenido en algo como esto (basta con cambiar las referencias de bases de datos en la base de datos. prueba y el valor persistenceUnitName alojamiento de persistenceUnit a persistenceUnitTest)

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd   http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> 
    <context:property-placeholder location="classpath*:META-INF/spring/*.properties"/> 
    <context:spring-configured/> 
    <context:component-scan base-package="com.jitter.finance.analyzer"> 
     <context:exclude-filter expression=".*_Roo_.*" type="regex"/> 
     <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/> 
    </context:component-scan> 
    <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource"> 
     <property name="driverClassName" value="${database.test.driverClassName}"/> 
     <property name="url" value="${database.test.url}"/> 
     <property name="username" value="${database.test.username}"/> 
     <property name="password" value="${database.test.password}"/> 
     <property name="testOnBorrow" value="true"/> 
     <property name="testOnReturn" value="true"/> 
     <property name="testWhileIdle" value="true"/> 
     <property name="timeBetweenEvictionRunsMillis" value="1800000"/> 
     <property name="numTestsPerEvictionRun" value="3"/> 
     <property name="minEvictableIdleTimeMillis" value="1800000"/> 
    </bean> 
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 
    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> 
    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="persistenceUnitName" value="persistenceUnitTest"/> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 
</beans> 

5) Por último, puede poner a prueba su clase como esta:

import org.junit.Test; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; 

@ContextConfiguration(locations = {"classpath*:/META-INF/spring/testApplicationContext*.xml"}) 
public class QuoteListTest extends AbstractJUnit4SpringContextTests { 
    @Test 
    public void checkQuote(){ 
     /* some code to test, this will interact with the defined database.test */ 
    } 
} 
Cuestiones relacionadas