2010-03-14 4 views
10

J'écris un test jUnit pour un constructeur qui analyse une chaîne puis vérifie de nombreuses choses. Quand il y a des données erronées, pour chaque chose, une exception IllegalArgumentException avec un message différent est levée. Donc, je voudrais écrire des tests pour cela, mais comment puis-je savoir quelle erreur a été lancée? Voici comment puis-je le faire:jUnit la même exception dans différents cas

@Test(expected=IllegalArgumentException.class) 
public void testRodneCisloRok(){ 
    new RodneCislo("891415",dopocitej("891415")); 
} 

et voici comment je voudrais être, mais je ne sais pas s'il est possible d'écrire en quelque sorte:

@Test(expected=IllegalArgumentException.class("error1")) 
public void testRodneCisloRok(){ 
    new RodneCislo("891415",dopocitej("891415")); 
} 

Répondre

4

Vous » ll besoin de le faire à l'ancienne:

@Test 
public void testRodneCisloRok() { 
    try { 
     new RodneCislo("891415",dopocitej("891415")); 
     fail("expected an exception"); 
    } catch (IllegalArgumentException ex) { 
     assertEquals("error1", ex.getMessage()); 
    } 
} 

la syntaxe @Test(expected=...) est une commodité à portée de main, mais il est trop simple dans de nombreux cas.

S'il est important de distinguer les conditions d'exception, vous pouvez envisager de développer une hiérarchie d'exceptions de classe pouvant être interceptée spécifiquement. Dans ce cas, une sous-classe de IllegalArgumentException pourrait être une bonne idée. C'est sans doute une meilleure conception, et votre test peut attraper ce type d'exception spécifique.

32

Si vous avez JUnit 4.7 ou au-dessus, vous pouvez utiliser ce (élégant) façon:

@Rule 
public ExpectedException exception = ExpectedException.none(); 

@Test 
public void testRodneCisloRok(){ 
    exception.expect(IllegalArgumentException.class); 
    exception.expectMessage("error1"); 
    new RodneCislo("891415",dopocitej("891415")); 
} 
Questions connexes