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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top