2010-10-28 16 views
9

Questa potrebbe essere una domanda concettualmente stupida, ma potrebbe anche non esserlo e dato che sono ancora uno studente penso che non dovrei avere problemi a chiedere.Asserire eccezioni in Java, come?

Immagina di avere un metodo che, in determinate condizioni, genererà un valore NumberFormatException. Voglio scrivere un Test unitario per vedere se l'eccezione è stata correttamente girata. Come posso raggiungere questo obiettivo?

P.S. Sto usando JUnit per scrivere i Test delle unità.

Grazie.

risposta

29

Come altri utenti suggerito, se si utilizza JUnit4, quindi è possibile utilizzare l'annotazione:

@Test(expected=NumberFormatException.class);

Tuttavia, se si utilizza una versione precedente di JUnit, o se si vuole fare più "eccezione" asserzioni nello stesso metodo di prova, quindi il linguaggio standard è:

try { 
    formatNumber("notAnumber"); 
    fail("Expected NumberFormatException"); 
catch(NumberFormatException e) { 
    // no-op (pass) 
}
+0

Questo è un buon idioma per quando si desidera testare le cose sull'eccezione, come il suo messaggio, non solo la sua esistenza. – Yishai

+0

+1 - Un buon punto sulla versione precedente. – Feanor

+0

+1 - Una risposta a questa domanda non è completa senza il secondo esempio. In pratica ho bisogno di default a questo approccio il più delle volte per le ragioni citate. – Synesso

2

Usa @Test (expected = IOException.class)

http://junit.sourceforge.net/doc/faq/faq.htm#tests_7

Questo va bene se si dispone di una sola eccezione previsto. Una strategia alternativa consiste nell'aggiungere un Assert.fail() alla fine del metodo di test. Se non viene lanciata un'eccezione, il test fallirà di conseguenza. per esempio.

@Test 
public void testIOExceptionThrown() {  
    ftp.write(); // will throw IOException  
    fail(); 
} 
10

Supponendo che si sta utilizzando JUnit 4, chiamare il metodo nel test in un modo che induce a gettare l'eccezione, e utilizzare l'annotazione JUnit

@Test(expected = NumberFormatException.class) 

Se l'eccezione viene lanciata, il test passerà.

+1

+1 - Veloce, ragazzo – duffymo

+0

@duffymo: Grazie! :) – Feanor

3

You can do this:

@Test(expected=IndexOutOfBoundsException.class) 
    public void testIndexOutOfBoundsException() { 
     ArrayList emptyList = new ArrayList(); 
     Object o = emptyList.get(0); 
    } 
1

Aggiungi questa annotazione prima del tuo metodo di prova; farà il trucco.

@Test(expected = java.lang.NumberFormatException.class) 
public void testFooMethod() { 
    // Add code that will throw a NumberFormatException 
} 
8

Se è possibile utilizzare JUnit 4.7, è possibile utilizzare il ExpectedException Regola

@RunWith(JUnit4.class) 
public class FooTest { 
    @Rule 
    public ExpectedException exception = ExpectedException.none(); 

    @Test 
    public void doStuffThrowsIndexOutOfBoundsException() { 
    Foo foo = new Foo(); 

    exception.expect(IndexOutOfBoundsException.class); 
    exception.expectMessage("happened?"); 
    exception.expectMessage(startsWith("What")); 
    foo.doStuff(); 
    } 
} 

Questo è molto meglio di @Test(expected=IndexOutOfBoundsException.class) perché il test avrà esito negativo se IndexOutOfBoundsException è gettato prima foo.doStuff()

Vedi this article e the ExpectedException JavaDoc per dettagli

+0

Per ragionamento e spiegazione approfonditi Vorrei raccomandare questo articolo: http://monkeyisland.pl/2010/07/26/expected-exception-in-tests/ +1 da parte mia. –

+0

+1 - Non sapevo che esistesse. –

+0

@JonathanDrapeau ha corretto il collegamento. Grazie per avermi fatto sapere! – NamshubWriter

0

Una soluzione che io s non associato a una particolare versione di JUnit fornita da catch-exception che è stata creata per superare alcuni svantaggi intrinseci ai meccanismi di JUnit.

Problemi correlati