434 Stimmen

Wie testet man, dass keine Ausnahme geworfen wird?

Ich weiß, dass eine Möglichkeit, dies zu tun, wäre:

@Test
public void foo() {
   try {
      // Führe den Code aus, von dem du keine Ausnahmen erwartest.
   } catch(Exception e) {
      fail("Sollte keine Ausnahme geworfen haben");
   }
}

Gibt es einen saubereren Weg, dies zu tun? (Vielleicht mit Junit's @Rule?)

1voto

Yugang Zhou Punkte 7023

Wenn Sie testen möchten, ob Ihr Testziel die Ausnahme tatsächlich abfängt. Lassen Sie den Test einfach wie folgt (mit dem Mock-Collaborator unter Verwendung von jMock2):

@Test
public void consumesAndLogsExceptions() throws Exception {

    context.checking(new Expectations() {
        {
            oneOf(collaborator).doSth();
            will(throwException(new NullPointerException()));
        }
    });

    target.doSth();
 }

Der Test würde bestehen, wenn Ihr Ziel die geworfene Ausnahme tatsächlich abfängt, andernfalls würde der Test fehlschlagen.

Wenn Sie Ihre Ausnahmeabfanglogik testen möchten, wird es komplexer. Ich schlage vor, die Verarbeitung einem Collaborator zu überlassen, der gemockt werden könnte. Daher könnte der Test wie folgt aussehen:

@Test
public void consumesAndLogsExceptions() throws Exception {
    Exception e = new NullPointerException();
    context.checking(new Expectations() {
        {
            allowing(collaborator).doSth();
            will(throwException(e));

            oneOf(consumer).consume(e);
        }
    });

    target.doSth();
 }

Aber manchmal ist es überdesignet, wenn Sie es nur protokollieren möchten. In diesem Fall könnte dieser Artikel(http://java.dzone.com/articles/monitoring-declarative-transac, http://blog.novoj.net/2008/09/20/testing-aspect-pointcuts-is-there-an-easy-way/) hilfreich sein, wenn Sie in diesem Fall auf TDD bestehen.

0voto

Crenguta S Punkte 506

Sie können dies tun, indem Sie eine @Rule verwenden und dann die Methode reportMissingExceptionWithMessage wie unten gezeigt aufrufen: Dies ist Scala-Code.

Bildbeschreibung hier eingeben

0voto

LazerBanana Punkte 6365

Sie können erwarten, dass die Ausnahme nicht durch das Erstellen einer Regel ausgelöst wird.

@Rule
public ExpectedException expectedException = ExpectedException.none();

0voto

Bin über dieses Problem gestolpert, seit ich einige generische Methoden erstellt habe wie

@Test
void testSomething() {
   checkGeneric(anComplexObect)
}

In https://newbedev.com/sonarqube-issue-add-at-least-one-assertion-to-this-test-case-for-unit-test-with-assertions wird etwas zur Annotation vorgeschlagen.

Die Lösung ist viel einfacher. Es reicht aus, die Methode "checkGeneric" in "assertGeneric" umzubenennen.

@Test
void testSomething() {
  assertGeneric(anComplexObect)
}

-2voto

Rocky Inde Punkte 1451

Der folgende Code besteht den Test für alle Ausnahmen, überprüft oder nicht überprüft, nicht:

@Test
public void testMyCode() {

    try {
        runMyTestCode();
    } catch (Throwable t) {
        throw new Error("Fehler!");
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X