Teste de exceções com o Junit

Boa noite pessoal!!!

Já estou há 2 dias procurando no google e em vários fóruns e achei muita informação porém não da forma que eu estou querendo…

preciso fazer testes de exceções com o Junit, porém estas exceções estão em um único método e em outra classe sendo:

public int teste(int credit, int sel) throws InvalidItemException, NoCoinsException, NotEnoughtCreditException, UnavailableItemException {
		
		if(credit == 0) throw new NoCoinsException();
		else if(credit < this.VAL) throw new NotEnoughtCreditException();
		else if(sel < MINSEL || sel > MAXSEL)throw new InvalidItemException();
		else if(!this.available(sel))throw new UnavailableItemException();
		else return this.VAL;
	}

O que eu queria saber é somente como posso fazer o teste de cada uma dessas exceções com o Junit???

Grato pelo esforço de todos que tentarem ajudar.

O código abaixo não funcionaria?

public void testTesteNoCoinsException(){ try{ teste(0,2); assertTrue("devia ter lançado exception",false); }catch(Exception e){ assertTrue("Nao disparou uma NoCoinsException",e instanceof NoCoinsException); } }

[quote=barenko]O código abaixo não funcionaria?

public void testTesteNoCoinsException(){ try{ teste(0,2); assertTrue("devia ter lançado exception",false); }catch(Exception e){ assertTrue("Nao disparou uma NoCoinsException",e instanceof NoCoinsException); } }[/quote]

cara vc não faz isso faz?

se vc usa as annotations do JUnit é bem simples

@Test(expected=ExececaoEsperada.class)
public void testAlgoumaCoisa(){
  //Bla bla
//Não precisa ter um assert Aqui
}

pronto, se ocorrer a execessão na execução ta tudo certo, o teste passa

Puxa amigo!!! Muito bom!!! Fiz alguns testes aqui e parece que vai dar certo sim… Valeu d+++++++++++++ :lol:

Opa, faço, mas não exatamente p/ pegar uma classe de exception, faço p/ pegar um getMessage específico…

Gostei dessa annotation, eu não sabia q existia, muito bom :smiley:

Aproveitando: e se eu tenho uma Exception genérica e gostaria de testar um erro específico nela?
Por exemplo:
Tenho um StatementException que pode encapsular tanto uma SQLException qto uma ReferenceException.

O melhor p/ testar nesse caso deveria ser isso?

@Test(expected=ReferenceException.class) public void testAlgoumaCoisa(){ try{ //Bla bla //Não precisa ter um assert Aqui }catch(StatementException e){ throw e.getCause(); } }

Além disso, há alguma dica p/ testar um getMessage específico no caso de uma SQLException, q contém msgs diferentes de acordo com o erro? Atualmente uso o esquema que eu postei levemente modificado:

public void testTesteNoCoinsException(){ try{ teste(0,2); assertTrue("devia ter lançado exception",false); }catch(Exception e){ assertTrue(e.getCause().getMessage().matches("Não foram encontradas referências entre os joins .* e .*")); } }

Se está utilizando o JUnit 4 tem o esquema do @Test(expected que o Felagund.
Porém se você quer verificar exatamente a mensagem da exception, como o disse o barenko, você pode usar a solução que ele postou. Eu só mudaria uma coisa, ao invés de colocar:

assertTrue("devia ter lançado exception",false);  

eu mudaria para

fail("devia ter lançado exception");

(fiz muito disso com JUnit3 :wink: