Olá… estou estudando o JUnit e me deparei com um caso de teste simples, mas que não estou conseguindo implementar. Pesquisei e não achei tbm, pelo menos não como quero.
Tenho uma classe Produto que não pode aceitar valores nulos como ID.
Então no setId eu lanço uma exceção caso o valor passado seja null.
Mas como faço o teste para validar isso?
Estou fazendo assim:
@Test(expected=CommunityFieldsErrorException.class)
public void testSetIdNull() throws Exception {
try {
System.out.println("creating bad id Product Null");
prod.setId(null);
} catch (CommunityFieldsErrorException ex) {
ex.printStackTrace();
}
}
Sendo CommunityFieldsErrorException a exceção que lanço.
E prod meu objeto Produto setado no setUp.
Isso causa exceção no console, e o teste diz que passou.
Mas, se eu tirar o @Test, tbm mostra que passou!! Então está validando ou nao??
Como poderia testar se o setId lançou uma exceção por ter passado valor nulo?
O ex.printStackTrace() não causa uma exceção no console. Só imprime.
A exceção ocorrida é tratada no catch, impressa e então descartada. Como vc não lança a exceção para o JUnit, seu teste falha.
Isso mostra o quão nocivo é descartar exceções dessa forma.
Se você quiser capturar a exceção crítica para gerar um log, mas não perde-la, pode fazer:
try {
//Código que pode gerar a exceção
}
catch (ExceptionCritica e) {
logaAExcecao(e);
throw e; //relança a exceção
}
Imprimir a exceção não é uma boa forma de log. Aliás, nem sempre essa á uma boa prática.
Entre no blog do Sergio, e dá uma lida nos artigos de exceções. São muito bons.
@Test(expected=CommunityFieldsErrorException.class)
public void testSetIdNull() throws Exception {
System.out.println("creating bad id Product Null");
prod.setId(null);
}