[RESOLVIDO] JUnit para exceptions!

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?

vlww
jopss :stuck_out_tongue:

O primeiro passo seria retirar o tratamento try/catch, se você está esperando que a exception seja lançada, então não deve tratar ela.

Mas teoricamente ele deveria não passar no teste pois você capturou a exceção.

O teste está certo apenas retire o try/catch
(P.S. Retire o system.out.print também)

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.

A sim, acho que me expressei mal… :wink:

Funfo, mas só uma dúvida. Faço isso:

@Test(expected=CommunityFieldsErrorException.class) 
    public void testSetIdNull() throws Exception {
       
            System.out.println("creating bad id Product Null");

            prod.setId(null);

    }

E ele me lança:

Testcase: testSetIdNull(model.CreateBadProductTest):	Caused an ERROR
model.Product - setId == null
model.util.CommunityFieldsErrorException: model.Product - setId == null

Opa! Mostrou a exceção e tal… “model.Product - setId == null” é a mensagem da minha exception.

Mas verifiquei que se eu comentar o @Test, faz a mesma saída! Então dá na mesma inserir a exceção na annotação @Test e não inserir nada?

No caso eu queria algo que verificasse a exceção lançada e “passasse no teste” caso tal exceção ocorresse. Ou estou pensando errado?

jopss :stuck_out_tongue:

Não, inserir na anotação deveria fazer o comportamento que você disse, o teste passar quando a exceção for lançada…

engraçado, eu uso isso aqui direto e sempre funciona. Tem certeza que vc está capturando a mesma exceção? Do mesmo pacote?

Opa! descobri o erro. Eu estava misturando códigos de versões diferentes. Passei a usar somente as anotações do JUnit 4 e funfo do geito que queria!

Pra quem passa por aqui e estiver duvidas, siga esta pagina e não tem erros:
http://junit.sourceforge.net/doc/cookbook/cookbook.htm

vlw a todos!!

jopss :stuck_out_tongue: