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.
[code]public abstract class AbstractDAO implements IDAO {
@Inject
Session session;
...
}
[/code]
[code]@Component
public class HospitalDAO extends AbstractDAO {
@Override
public Class<Hospital> getEntityClass() {
return Hospital.class;
}
}[/code]
[code]public class HospitalDAOTest {
@Mock
HospitalDAO dao;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
...[/code]
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.
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)
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.
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.
se vc preferir setar a session via reflection nos testes, não precisa criar o construtor.
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);
Cara, você é foda! Valeu.