Frage

Ich versuche, zu testen, ob eine bestimmte Methode eine erwartete Ausnahme von einer Methode löst. Wie pro JUnit4 Dokumentation und diese Antwort ich schrieb den Test als:

@Test(expected=CannotUndoException.class)  
public void testUndoThrowsCannotUndoException() {   
    // code to initialise 'command'

    command.undo();
}

Allerdings schlägt dieser Code den JUnit-Test, die geworfen (und erwartete) Ausnahme als Fehler melden.

Die Methode, die ich bin Tests haben nur diese im Körper:

public void undo() {
    throw new CannotUndoException();
}

Darüber hinaus wird der folgende Test bestanden:

public void testUndoThrowsCannotUndoException() {
    // code to initialise 'command'

    try { 
        command.undo();
        fail();
    } catch (CannotUndoException cue){

    }
}

Was bedeutet, dass die erwartete Ausnahme tatsächlich ausgelöst wird.

Ich plane eigentlich die Methode zu ändern, etwas zu tun, tatsächlich, und nicht nur die Ausnahme werfen, aber es hat mich neugierig, was das Problem verursacht hat, damit es in Zukunft wieder passieren sollte.

Die folgenden Kontrollen wurden durchgeführt:

  • die CannotUndoException in den Testfall importiert die richtige ist
  • Version 4 von JUnit ist das einzige auf meine Classpath
  • eine saubere und bauen von Eclipse-Workspace nicht auf das Ergebnis

Ich bin mit JUnit 4.1, und im gleichen Test verwende ich Mockito.

Was die irrtümlichen Fehler verursacht sein könnte?

War es hilfreich?

Lösung

Ich habe das Problem gefunden.

Der Testrunner Ich war mit war die richtigen (JUnit 4), jedoch erklärte ich meine Testklasse wie:

public class CommandTest extends TestCase

Was ich davon ausgehen, verursacht den Test Läufer es als JUnit-3-Test zu behandeln. Ich entfernte extends TestCase und erhielt die erwarteten Ergebnisse.

Andere Tipps

Ihr Test-Code sieht ok für mich.

Überprüfen Sie, ob Sie mit einem JUnit 4 testrunner laufen lassen, kein junit 3.8 testrunner - dies sehr wohl der Täter hier sein könnte (versuchen Sie von der Kommandozeile starten oder einfach nur visuell über die Befehlszeile überprüfen, wenn der Test ausgeführt wird). Die Classpath Ihres testrunner nicht das gleiche wie Ihr Projekt Classpath sein kann

Dies ist insbesondere dann der Fall innerhalb IDE. Alternativ können Sie auch auf junit 4.4 zu drücken versuchen und sehen, ob das Ihr Problem löst. (Junit 4.5 kann andere Probleme verursachen).

Ich hatte ein ähnliches Problem, und ich regelte es durch die Anmerkung hinzugefügt

@RunWith(JUnit4ClassRunner.class)

Welche erzählt die Einheit Tester mit der 4er-Version von JUnit

laufen

Curious.

Ich schrieb drei Klassen:

Ein 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);    
    }
}

Und eine JUnit 4.4 Test-Klasse:

import org.junit.Test;

public class UndoCommandTest
{
    @Test(expected=CannotUndoException.class)
    public void testUndo()
    {
        UndoCommand command = new UndoCommand();

        command.undo();
    }
}

Funktioniert perfekt -. Alle Tests bestanden, "grünes" Ergebnis

Wenn ich entferne die (erwartete = ...) von der Annotation des Test fehlschlägt, wie erwartet.

Ich bin mit Sun JDK 6, JUnit 4.4 und IntelliJ 7.0.5.

Wie funktioniert Ihr unterscheiden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top