Causa di un comportamento imprevisto con meccanismo di eccezione prevista JUnit 4 di?
-
23-08-2019 - |
Domanda
Sto cercando di provare che un particolare metodo genera un'eccezione prevista da un metodo. Come da documentazione JUnit4 e questa risposta ho scritto il test come:
@Test(expected=CannotUndoException.class)
public void testUndoThrowsCannotUndoException() {
// code to initialise 'command'
command.undo();
}
Tuttavia, questo codice non supera il test JUnit, segnalato la gettato (e atteso) eccezioni come un errore.
Il metodo che sto testando ha solo questo nel corpo:
public void undo() {
throw new CannotUndoException();
}
Inoltre, il seguente test viene superato:
public void testUndoThrowsCannotUndoException() {
// code to initialise 'command'
try {
command.undo();
fail();
} catch (CannotUndoException cue){
}
}
Il che significa che l'eccezione prevista è in realtà gettato.
Sono in realtà intenzione di cambiare il metodo di fare effettivamente qualcosa, piuttosto che generare l'eccezione, ma è mi ha fatto curioso di sapere cosa ha causato il problema, perché non dovrebbe accadere di nuovo in futuro.
Sono state apportate le seguenti controlli:
- il CannotUndoException importato nel caso di test è quello corretto
- versione 4 di JUnit è l'unico sul mio classpath
- un ambiente pulito e costruire di Eclipse spazio di lavoro non ha modificato l'esito
Sto usando JUnit 4.1, e nello stesso test che sto usando Mockito.
Quale potrebbe essere la causa del fallimento errata?
Soluzione
Ho trovato il problema.
Il TestRunner stavo usando era quella corretta (JUnit 4), tuttavia, ho dichiarato la mia classe di test come:
public class CommandTest extends TestCase
che presumo sia causando il test runner di trattarlo come un JUnit 3 test. Ho rimosso extends TestCase
e ha ricevuto i risultati attesi.
Altri suggerimenti
Il tuo codice di prova sembra ok per me.
Controlla che si sta eseguendo con JUnit 4 testrunner, non un testrunner JUnit 3.8 - questa potrebbe benissimo essere il colpevole qui (provare ad avviare dalla riga di comando o semplicemente controllare visivamente la riga di comando quando si esegue il test). Il percorso di classe del vostro testrunner potrebbe non essere lo stesso del vostro classpath del progetto
Questo è particolarmente vero all'interno di IDE. In alternativa si potrebbe anche provare a spingere per JUnit 4.4 e vedere se questo risolve il problema. (JUnit 4.5 può causare altri problemi).
Ho avuto un problema simile e ho fissato con l'aggiunta l'annotazione
@RunWith(JUnit4ClassRunner.class)
che racconta il tester unità per farlo funzionare con la versione 4er di Junit
Curioso.
ho scritto tre classi:
Un UndoCommand:
public class UndoCommand
{
public void undo()
{
throw new CannotUndoException();
}
}
A CannotUndoException:
// Note: extends the unchecked superclass RuntimeException
public class CannotUndoException extends RuntimeException
{
public CannotUndoException()
{
super();
}
public CannotUndoException(String message)
{
super(message);
}
public CannotUndoException(String message, Throwable cause)
{
super(message, cause);
}
public CannotUndoException(Throwable cause)
{
super(cause);
}
}
E un JUnit della classe 4.4 di prova:
import org.junit.Test;
public class UndoCommandTest
{
@Test(expected=CannotUndoException.class)
public void testUndo()
{
UndoCommand command = new UndoCommand();
command.undo();
}
}
ha funzionato perfettamente -. Tutti i test passano, "verde" risultato
Se rimuovo il (previsto = ...) dal annotazioni il test fallisce, come previsto.
sto utilizzando Sun JDK 6, JUnit 4.4 e IntelliJ 7.0.5.
Come si fa vostro differiscono?