Lá vai a minha solução sem utilizar Mock, pode ser feia, suja, mas parece que está funcionando legal. Eu particularmente não consegui “descobrir” como os mocks podem substituir todos os testes em relação a banco de dados, por isso estou utilizando um banco de dados apenas para teste, deixa eu explicar melhor.
Tenho o banco de dados do sistema, onde todas as pessoas o utilizam e fica armazenado no servidor de desenvolvimento. Eu crio outro banco de dados identico a esse, mas localmente na minha maquina. Uso o hibernate e dentro dele uso 2 arquivos de configurações diferentes, hibernate.conf.xml e hibernate-test.conf.xml. O primeiro é ligado ao servidor de desenvolvimento e o segundo é local, o detalhe do segundo que ele tem a opção de toda vez que rodar “dropar” e “criar” as tabelas, assim deixando os dados sempre vazios.
Dentro do sistema, tenho um servlet que inicializa o SessionFactory dentro de 1 DAO, esse servlet é executado quando meu AS sobe, no caso eu passo como parametro qual o arquivo de configuração eu vou usar, por exemplo
DAO dao = new DAO();
dao.start("/hibernate.conf.xml");
Dentro dos meus testCase, eu inicio o DAO mas passando como parametro o /hiberante-test.conf.xml.
Vamos supor que eu tenho o seguinte caso. Tenho uma Action chamada “Welcome” que será executada quando o sistema rodar. Essa Action verifica se existe algum usuário cadastrado no banco de dados com Level = 9, se nao houver nenhum usuario assim, deve redirecionar para uma pagina chamada wizard.jsp, senao chamada a welcome.jsp.
Dentro dela, eu preciso fazer um “select” no banco para testar se existe 1 usuário com level = 9. Assim meu testCase para essa Action ficaria mais ou menos assim.
DAO dao;
public void setUP() {
dao = new DAO();
dao.start("/hibernate-test.conf.xml"); //Iniciar o Hibernate com BD de teste, lembrando que a base estará vazia, assim nenhum usuario estará cadastrado.
}
public void testWelcomeSemAdmin() {
//Testar quando nao tem Admin e verificar se ele está chamando um return "wizard"
WelcomeAction welcome = new WelcomeAction();
assertEquals("wizard",welcome.execute());
}
public void testWelcomeComAdmin() {
insertAdmin(); //aqui irei adicionar 1 admin manualmente (método embaixo)
assertEquals(Action.SUCCESS,welcome.execute()); //Quando testar aqui, teoricamente terá o usuário cadastrado..
}
private void insertAdmin() {
Users users = new Users();
users.setName("teste");
users.setLevel(9);
DAO.insert(users); //inseri no meu Banco de Teste
}
Basicamente é assim que eu faço teste referente a banco de dados. Particularmente eu NUNCA vi isso em nenhum lugar, mas até agora parece que está legal.
Alex, se quiser, eu estou terminando a implementar essa parte em um projetinho open-source, quando eu tiver algo “palpável” eu posso te mostrar, só me da 1 toque.
Pra galera que nao concorda com isso, poderia ajudar falando uma solução mais elegante e correta para trabalhar com Teste Unitário em Banco de Dados.
Obs: eu respondi o tópico na faculdade, sem java, sem nada, entao pode haver erros de digitação no código.
Espero ter ajudado