1. Einleitung

Mit JUnit 5 Tests möchten wir auch auf erwartete Exceptions prüfen. Wie einfach das geht, zeige ich in diesem Artikel.

Den vollständigen Code findest du auf GitHub:
https://github.com/MatthiasPischka/java-tipps/tree/master/junit5-erwartete-exceptions

2. Vorbereitung

Wir schreiben eine Klasse, die später auch als Testklasse für JUnit 5 dient, und fügen dort die im Code-Beispiel dargestellte Methode ein. Sie wandelt eine Zeichenkette in eine positive Ganzzahl um. Die Methode überprüft im Vorfeld den Eingabeparameter und reagiert mit passenden Exceptions, sofern die Eingabe nicht valide ist.

Mit dem Test positiverTest() wird zunächst die eigentliche Funktionalität der Konvertierung überprüft.

public class JUnit5ErwarteteExceptions {

  @Test
  public void positiverTest() {
    assertEquals(15, this.konvertiereInPositiveGanzzahl("15"));
    assertEquals(0, this.konvertiereInPositiveGanzzahl("0"));
  }

  private Integer konvertiereInPositiveGanzzahl(String zahlAlsZeichenkette) {

    if (zahlAlsZeichenkette == null) {
      throw new IllegalArgumentException("Der Eingabeparameter ist leer");
    }
    if (!zahlAlsZeichenkette.matches("\\d+")) {
      throw new IllegalArgumentException("Die Eingabe entspricht nicht einer positiven Ganzzahl");
    }

    return Integer.parseInt(zahlAlsZeichenkette);
  }
}

3. Erwartete Exceptions prüfen – assertThrows

JUnit 5 bietet dazu die Methode assertThrows(...) an. Ihr muss der Typ der Exception und eine ausführbare Expression übergeben werden.

3.1 Überprüfung des Typs

Im ersten Schritt prüfen wir nur, dass die erwartete Exception geworfen wird. Dazu wird die weiter oben gezeigte Methode aufgerufen. Alle übergebenen Werte führen zur IllegalArgumentException.

  @Test
  public void erwarteExceptionTest() {

    assertThrows(IllegalArgumentException.class, () -> this.konvertiereInPositiveGanzzahl(null));
    assertThrows(IllegalArgumentException.class, () -> this.konvertiereInPositiveGanzzahl(""));
    assertThrows(IllegalArgumentException.class, () -> this.konvertiereInPositiveGanzzahl("-1"));
    assertThrows(IllegalArgumentException.class, () -> this.konvertiereInPositiveGanzzahl("xy"));
    assertThrows(IllegalArgumentException.class, () -> this.konvertiereInPositiveGanzzahl("1.3"));
  }

3.2 Vergleich der Exception-Nachricht

In den meisten Fällen wird die Variante aus 3.1 ausreichen. Es gibt jedoch Fälle, bei denen auch die Nachricht der erwarteten Exception überprüft werden soll. In dem gezeigten Beispiel der Konvertierung macht das durchaus Sinn, denn in der Methode kann es zu zwei verschiedenen Fehlern gleichen Typs kommen. Das folgende Code-Beispiel zeigt, wie man damit umgehen kann.
AssertThrows(...) gibt dazu die gefangene und gleichzeitig erwartete Exception als Parameter zurück.

  @Test
  public void erwarteKonkreteFehlermeldungTest() {

    Exception exceptionLeererParameter = assertThrows(IllegalArgumentException.class,
        () -> this.konvertiereInPositiveGanzzahl(null));
    assertEquals("Der Eingabeparameter ist leer", exceptionLeererParameter.getMessage());

    Exception exceptionFalscheEingabe = assertThrows(IllegalArgumentException.class,
        () -> this.konvertiereInPositiveGanzzahl("xy"));
    assertEquals("Die Eingabe entspricht nicht einer positiven Ganzzahl", exceptionFalscheEingabe.getMessage());
  }

4. Weiteres

Hier kannst du nachlesen, wie du JUnit 5 für Tests in einem echten CDI-Container verwendest.

Kategorien: Entwicklung

0 Kommentare

Schreibe einen Kommentar

Avatar-Platzhalter

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert