2011-04-05 20 views
27

Ho il seguente test:JUnit @Test prevede l'annotazione non funziona

@Test(expected = IllegalStateException.class) 
public void testKey() { 
    int key = 1; 
    this.finder(key); 
} 

Ma JUnit rapporti, che il test ha esito negativo, anche se getta - come previsto - un IllegalStateException.

Devo configurare qualcos'altro per farlo funzionare?


ho eseguito il test ora con

@RunWith(Suite.class) 
@SuiteClasses(Test.class) 
public class TestSuite { 

} 

come in this question, ma non sono ancora ottenere il risultato desiderato.

E quando rimuovo il prefisso test sto ancora ricevendo un errore.

Devo dire che eseguo questi test con Eclipse, ma è configurato per utilizzare JUnit 4 Runner.

+5

Forse si sta eseguendo inavvertitamente il test con JUnit 3. La classe di test estende TestCase? Cosa succede quando cambi il nome del metodo di test in modo che non inizi più con 'test'? –

+0

Quando il nome del test non inizia con 'test', viene visualizzato il messaggio' junit.framework.AssertionFailedError: Nessun test trovato in MyClass' –

+0

E sì, la classe estende 'TestCase'. –

risposta

45

Il problema era che la classe in cui il test era annidato era un'estensione di TestCase. Poiché questo è lo stile JUnit 3, l'annotazione non ha funzionato.

Ora la mia classe di test è una classe a sé stante.

2

Questo mi sembra corretto.

Controlla le tue ipotesi. Sei sicuro getta l'eccezione? Se ciò che dici è vero, rimuovere l'attesa dall'annotazione dovrebbe farlo fallire.

Vorrei passare il codice con un debugger per vedere cosa sta succedendo. Immagino che tu abbia un IDE che lo farà, come IntelliJ.

3

No, questo test JUnit dovrebbe funzionare così com'è: non c'è più niente da fare su questo lato.

Cosa ti rende sicuro che il test lanci un IllegalStateException? È possibile che venga incluso in un'altra eccezione di tipo diverso?

Si prega di inviare il messaggio esatto di fallimento da JUnit.

Come suggerito da @duffymo, è facile verificare quale (eventuale) eccezione il test realmente genera.

+0

Messaggio di JUnit: 'java.lang.IllegalStateException: ... MyErrorMessage ..' –

+0

Sì, è possibile che l'eccezione sia racchiusa in un altro, ma in tal caso è necessario dichiarare _wrapper_ uno, e mai l'altro. – Powerslave

1

Appena testato su JUnit4: questo DO funziona, il test è stato completato con successo. Guarda se è un IllegalSelectorException o simile.

6

ho provato questo e funziona perfettamente come previsto.

public class SampleClassTest { 
@Test(expected = ArithmeticException.class) 
public void lost(){ 
this.lost(0); 
} 
private void lost(int i) throws ArithmeticException { 
System.out.println(3/i); 
} 
} 

anche assicurare che Junit4 viene aggiunto come dipendenza, @ (annotazioni) sono nuova funzionalità di JUnit 4.

4

Ho affrontato lo stesso problema, la soluzione è semplice: "Non si estende classe TestCase"

7
@RunWith(JUnit4.class) 
public class MyTestCaseBase extends TestCase 

Ho anche avuto problemi con @Test (atteso = ...) annotazione quando ho esteso la classe TestCase nel mio test di base. L'utilizzo di @RunWith (JUnit4.class) ha aiutato immediatamente (non è una soluzione estremamente elegante, lo ammetto)

+0

Non dovresti estendere più TestCase con JUnit4 +. –

0

Ho avuto lo stesso problema, ho appena cambiato le mie istruzioni sulle importazioni. Ho rimosso:

import org.junit.jupiter.api.Test; 

import junit.framework.TestCase; 

e ha aggiunto:

import org.junit.Test; 

e ha funzionato bene per me.