Spring + jpa + junit

0 respostas
hugosantos

Fala galera, blz ?

Então estou desenvolvendo uma app usando spring + jpa e estou com dificuldade de deixar uma persistence-unit para teste e outra para produção.

O que eu gostaria de fazer é usar as mesmas configurações do spring que uso em produção (Postgre) mas com o banco apontando para o banco de teste (HSQL) sem ter que duplicar o applicationContext.xml nem o persistence.xml pra ficar com os ambientes o mais parecido o possível.

O que eu tentei foi ter dois applicationContext.xml sendo que o de teste contém apenas a minha conexão para teste. Eu esperava que ele sobrescrevesse o bean mas vejo que ele ainda aponta para o banco de prod. Embora ele mostre uma mensagem dizendo que está sobrescrevendo o emf.

Alguém tem uma sugestão para resolver o problema ou uma outra abordagem para fazer os testes ?

Abaixo as configurações...

persistence.xml

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

	<persistence-unit name="default">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name="hibernate.archive.autodetection" value="class, hbm"/>
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /> 
			<property name="hibernate.c3p0.min_size" value="5" />
			<property name="hibernate.c3p0.max_size" value="20" />
			<property name="hibernate.c3p0.timeout" value="180" />
			<property name="hibernate.c3p0.idle_test_period" value="100" />
			<property name="hibernate.generate_statistics" value="true" />
		</properties>
	</persistence-unit>
</persistence>

applicationContext.xml (conexão com Postgre)

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<context:annotation-config />
	<context:property-placeholder location="classpath:jdbc.properties"/>

	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

	<bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="default" />
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="javax.persistence.jdbc.driver">${jdbc.driver}</prop>
				<prop key="javax.persistence.jdbc.url">${jdbc.url}</prop>
				<prop key="javax.persistence.jdbc.user">${jdbc.user}</prop>
				<prop key="javax.persistence.jdbc.password">${jdbc.password}</prop>
			</props>
		</property> 
	</bean>

</beans>
applicationContext-test.xml (conexão com HSQL)
<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<context:property-placeholder location="classpath:jdbc.test.properties"/>

	<bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="default" />
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="javax.persistence.jdbc.driver">${jdbc.driver}</prop>
				<prop key="javax.persistence.jdbc.url">${jdbc.url}</prop>
				<prop key="javax.persistence.jdbc.user">${jdbc.user}</prop>
				<prop key="javax.persistence.jdbc.password">${jdbc.password}</prop>
			</props>
		</property> 
	</bean>

</beans>
Teste ( o que eu quis dizer aqui foi... "rode com configuração de produção mas com conexão de teste" )
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml","/applicationContext-test.xml"})
public class DAOTest {
....
}

No log ele me dá a mensagem de que está sobrescrevendo...

17:53:32,818 INFO [DefaultListableBeanFactory] Overriding bean definition for bean 'emf': [color=red]replacing[/color] [Generic bean: class [org.springframework.orm.jpa.LocalEntityManagerFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [[color=red]applicationContext.xml[/color]]] with [Generic bean: class [org.springframework.orm.jpa.LocalEntityManagerFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [[color=red]applicationContext-test.xml[/color]]]

Mas logo depois ele faz conexão com o banco de produção (Postgre) não de teste (HSQL)

17:53:33,896 INFO [C3P0ConnectionProvider] C3P0 using driver: org.postgresql.Driver at URL: jdbc:postgresql://localhost/bla
17:53:33,897 INFO [C3P0ConnectionProvider] Connection properties: {user=blauser, password=****, autocommit=true, release_mode=auto}
17:53:33,897 INFO [C3P0ConnectionProvider] autocommit mode: true
17:53:33,936 INFO [MLog] MLog clients using log4j logging.
17:53:34,204 INFO [C3P0Registry] Initializing c3p0-0.9.1 [built 16-January-2007 14:46:42; debug? true; trace: 10]
17:53:34,374 INFO [AbstractPoolBackedDataSource] Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@d5e9dc2c [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@8d755832 [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge0ys8a1760s6qe0t2z2|1e184cb, idleConnectionTestPeriod -> 100, initialPoolSize -> 5, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 180, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 5, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@49e5f173 [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 1hge0ys8a1760s6qe0t2z2|4ac216, jdbcUrl -> jdbc:postgresql://localhost/bla, properties -> {user=******, password=******, autocommit=true, release_mode=auto} ], preferredTestQuery -> null, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 1hge0ys8a1760s6qe0t2z2|19a0203, numHelperThreads -> 3 ]
17:53:35,054 INFO [SettingsFactory] RDBMS: PostgreSQL, version: 8.4.4
17:53:35,054 INFO [SettingsFactory] JDBC driver: PostgreSQL Native Driver, version: PostgreSQL 8.4 JDBC4 (build 701)
17:53:35,106 INFO [Dialect] Using dialect: org.hibernate.dialect.PostgreSQLDialect

O que eu posso estar fazendo errado ?

Abraços.

Criado 22 de agosto de 2010
Respostas 0
Participantes 1