Teste unitário do DAO, usando o GUICE, Vraptor e Mockito

7 respostas
marcio89

Pessoal, alguém tem um projeto bacana de testes unitários para compartilhar ?
Estou com algumas dúvidas e queria tirar aqui.

Primeiro. Tenho as seguintes classes.

public abstract class AbstractDAO<E extends AbstractEntity> implements IDAO<E> {

	@Inject
	Session session;
        ...
}
@Component
public class HospitalDAO extends AbstractDAO<Hospital> {

	@Override
	public Class<Hospital> getEntityClass() {
		return Hospital.class;
	}

}
public class HospitalDAOTest {

	@Mock
	HospitalDAO dao;

	@Before
	public void init() {
		MockitoAnnotations.initMocks(this);
	}
        ...

Após o @Before eu tenho o dao, mas com a session null. Qual seria a melhor forma de ter a sessão nesse caso ?
Teria que usar um when(dao.getSession()).return(session) e fazer um @Mock da Session ? Não entendo muito bem porque o Mock já não injeta a session pra mim.

Segundo. Como eu faço para usar um hibernate.cfg.xml no test. Tem como ? Ai eu usaria um igual ao da aplicação mas com a base trocada. Qual a melhor forma de fazer isso ? Posso alterar somente a string de conexão no meu TestSuite?

Valeu.

7 Respostas

Lucas_Cavalcanti

Se vc mockou o DAO, vc não precisa se preocupar com a Session, pq ele não vai executar os métodos reais.

para um @Mock o objeto não vai ter comportamento nenhum, vc tem que prover o comportamento desejado para o teste.

Mas vc só vai fazer isso nos testes das classes que usam o DAO. No teste do DAO vc não vai mockar o DAO.

O ideal é receber a session no construtor do DAO, daí vc pode passar uma session controlada pra ele.

Segundo: só use o hibernate.cfg.xml de teste nos testes dos daos. E para usar, crie um arquivo hibernate.cfg.test.xml e carregue-o usando a API do Hibernate (crie a sessionFactory e a Session a partir dela)

marcio89

Pô, brigadão pela resposta. Mas então minha classe que antes tava linda…

@Inject
Session session.

Com construtor vazio (sem construtor definido), vai ter que ser modificada ?
Valeu.

marcio89

Porque na verdade o código abaixo, ficava so na classe Abstrata, se eu tiver que passar no construtor, vou ter que criar o construtor em todos os DAOs. Isso é triste, hahahaha.

@Inject Session session

E agora vou ter que mudar todo o meu código pra fazer os testes.

Lucas_Cavalcanti

se vc preferir setar a session via reflection nos testes, não precisa criar o construtor.

marcio89

Como seria isso ?
Valeu.

Lucas_Cavalcanti

no @Before do teste:

HospitalDAO dao = new HospitalDAO();

Session session = // cria a session usando o cfg de test

new Mirror().on(dao).set().field("session").withValue(session);
marcio89

Cara, você é foda! Valeu.

Criado 8 de julho de 2013
Ultima resposta 9 de jul. de 2013
Respostas 7
Participantes 2