Integrando Spring + JUnit + HSQLDB

Estou querendo fazer integração entre o JUnit + Spring + HSQLDB, sendo que quero saber se tem a possibilidade de criar dois applicationContext e dois persistence.xml, um para o contexto normal e outro para o contexto de teste.

Existe a possibilidade se fazer isso?

Desde já agradeçoa a ajuda de todos.

Sim, é possivel.
Crie o seu aquivo “applicationContext” para sua aplicação.
Crie o seu arquivo “test-applicationContext” para seus testes. (O nome não precisa ser esse).

Coloque seu arquivo de teste no classpath.
Dentro dele faça o import que você quer do seu hibernate (de teste).

E na classe do junit faça isso.

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:test-applicationContext" }) public class MinhaClasseTest {}

Valeu funcionou.

Agora estou com problema na hora que o DAO roda, segue o erro:

java.lang.UnsupportedOperationException: The user must supply a JDBC connection at org.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:54) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1573) at org.hibernate.loader.Loader.doQuery(Loader.java:696) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) at org.hibernate.loader.Loader.doList(Loader.java:2228) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125) at org.hibernate.loader.Loader.list(Loader.java:2120) at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312) at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1722) at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175) at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:88) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:310) at $Proxy22.getSingleResult(Unknown Source) at br.com.test.dao.ClienteDAO.consultarTitularidadeDoClienteAPartirDoCpf(ClienteDAO.java:24) at br.com.test.endpoint.ClienteEndpoint.consultaDadosCadastrais(ClienteEndpoint.java:39) at br.com.test.endpoint.test.ClienteEndpoinTest.testarConsultarDadosCadastriasClienteTitular(ClienteEndpoinTest.java:47) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

O meu persistence está assim:

[code]

<?xml version="1.0" encoding="UTF-8"?> org.hibernate.ejb.HibernatePersistence br.com.test.model.Cliente br.com.test.model.TipoPortador true [/code]

O estranho que quando faço o deploy da aplicação tudo roda normalmente. A única diferença é que no contexto de teste eu estou querendo usar o HSQLDB e por isso estou usando um outro persistence.xml (que está acima).

Onde está as tags do “javax.persistence”

troque por

<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" /> <property name="hibernate.connection.username" value="sa" /> <property name="hibernate.connection.password" value="" /> <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:." />

Opa, valeu pela ajuda. Funcionou!

Agora uma outra dúvida, que me surgiu agora, com o HSQLDB eu jogo o banco na memória, mas toda a estrutura deve estar lá, como tabelas, triggers e etc, existem alguma maneira de toda vez que o teste for inicializado essa estrutura “subir” para a memória?

Que bom que funcionou.

Não sei te responder, mas imagino que sim, deve ter jeito de criar um script e o banco ler ao iniciar.
Se você gostaria de já ter as cargas para seus testes (como select etc.) talvez uma opção seja o "dbunit"
Com ele você consegue trabalhar com cargas.

Mas pode ser que exista algo melhor, vou ficar te devendo essa hehehe.

flws.