[RESOLVIDO] Testes de DAO - 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: