Pessoal, tenho os testes unitários dos controllers do projeto, mas não encontro nada relacionado a testes de DAO.
Alguém já conseguiu testar os DAO em um projeto em Vraptor?
Pessoal, tenho os testes unitários dos controllers do projeto, mas não encontro nada relacionado a testes de DAO.
Alguém já conseguiu testar os DAO em um projeto em Vraptor?
Estou fazendo dessa maneira, mas dá problema:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
"file:./WebRoot/WEB-INF/config/spring/applicationContext-test.xml"
})
public class ObjectDaoTest {
@Autowired
private ObjetDao objectDao;
@Test
public void list(){
List<Objects> objects = objectDao.list(true, 17L);
assertNotNull(objects);
}
}
E no applicationContext-test.xml tenho:
<bean id="objectDao" class="br.com.projeto.dao.impl.ObjectDaoImpl" >
<property name="sessionFactory" ref="sessionFactory" />
</bean>
O erro que dá é:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'objectDao': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.Session br.com.project.dao.impl.GenericDaoImpl.session; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.Session] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:96)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:44)
at org.springframework.test.context.TestContext.buildApplicationContext(TestContext.java:198)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:233)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:126)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:85)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:95)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:139)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.Session br.com.grupofortes.intranet.dao.impl.GenericDaoImpl.session; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.Session] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282)
... 30 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.hibernate.Session] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
... 32 more
vc precisa registrar um bean que cria uma Session com configurações de teste.
Lucas, estou voltando agora a mexer com esses testes.
Não sei se as configurações que você se referia seriam essas que possuo no applicationContext.xml:
<context:property-placeholder location="classpath:configuracoes-test.properties" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432/projeto_test"/>
<property name="username" value="postgres"/>
<property name="password" value="bla"/>
<property name="suppressClose" value="true" />
</bean>
<!-- Configuração do Aspecto das transações. -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:hibernate-teste.cfg.xml" />
<property name="packagesToScan" value="br.com.projeto" />
</bean>
Estou fazendo da maneira correta?
Não conheço ninguém que tenha conseguido fazer esse tipo de teste com o Vraptor.
esse bean que vc configurou só te cria uma SessionFactory, não uma Session… vc precisa registrar um componente que provê a Session, como esse:
https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/util/hibernate/SessionCreator.java
Complementando a solução a quem precisar configurar Spring + Session(hibernate 4) + JUnit
Configurando o context para passar a session
...
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="mySQL" />
...
<bean id="criador"
class="controle.CriadorSession">
<constructor-arg type="org.hibernate.SessionFactory" index="0">
<ref bean="sessionFactory" />
</constructor-arg>
</bean>
<bean id="session" class="org.hibernate.Session" factory-bean="criador" factory-method="getInstance">
</bean>
<bean id="daoObj" class="dao.DaoObj" >
</bean>
Exemplo do criador de session
@Component
public class CriadorSession implements ComponentFactory<Session> {
private SessionFactory sessionFactory;
private Session session;
public CriadorSession(SessionFactory factory) {
this.sessionFactory = factory;
}
@PostConstruct
public void abre() {
this.session = sessionFactory.openSession();
}
@PreDestroy
public void fecha(){
session.close();
}
public Session getInstance() {
return session;
}
}
Após isto na dao só precisa utilizar Autowired na session
@Component
public class DaoObj{
@Autowired
private Session session;
E a classe de teste da Dao
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/utils-context.xml")
public class DaoObj extends AbstractTransactionalJUnit4SpringContextTests{
@Autowired
DaoObj daoAnexoAvaliacao;
public DaoObj() {
}
@Test
public void carrega() {
Obj objt= DaoObj.carrega(1);
..
Funcionou direitinho, obrigado. :thumbup: