6.1 behauptet

Asserts sind spezielle Prüfungen , die an verschiedenen Stellen im Code eingefügt werden können. Ihre Aufgabe ist es festzustellen, dass etwas schief gelaufen ist. Oder besser gesagt, um zu überprüfen, ob alles so läuft, wie es sollte. Dies erfolgt „nach Bedarf“ und Sie können es auf verschiedene Arten einstellen.

Im obigen Code sind Ihnen bereits einige Behauptungen begegnet. Die erste besteht darin, Objekte auf Gleichheit zu prüfen. Wenn die Objekte nicht gleich sind, wird eine Ausnahme ausgelöst und der Test schlägt fehl.

Die Reihenfolge des Vergleichs ist hier wichtig , da JUnit im Abschlussbericht so etwas schreiben wird wie „Wert 1 erhalten, aber 3 wurde erwartet“. Das allgemeine Format für eine solche Prüfung ist:

assertEquals(standard , meaning)

Beispiel:

@Test
public void whenAssertingEquality () {
    String expected = "3.1415";
    String actual = "3";

    assertEquals(expected, actual);
}

6.2 Methoden „asserEquals“, „asserTrue“, „asserFalse“.

Im Folgenden werde ich die beliebtesten Methoden auflisten – Behauptungen. Anhand ihrer Namen lässt sich durchaus erraten, wie sie funktionieren. Aber ich schreibe trotzdem eine kurze Erklärung:

affirmEquals Überprüft, ob zwei Objekte gleich sind
behauptenArrayEquals Prüft, ob zwei Arrays gleiche Werte enthalten
behauptenNotNull Überprüft, ob das Argument nicht null ist
behauptenNull Überprüft, ob das Argument null ist
behauptenNotSame Stellen Sie sicher, dass die beiden Argumente nicht dasselbe Objekt sind
behauptenSame Überprüfen Sie, ob die beiden Argumente dasselbe Objekt sind
behauptenTrue Überprüft, ob das Argument wahr ist
affirmFalse Überprüft, ob das Argument falsch ist

Einige dieser Methoden scheinen überflüssig zu sein. Warum „assertSame(a, b)“ verwenden , wenn Sie einfach „assertTrue(a == b)“ schreiben können ?

Der Punkt ist, dass Assert eine sehr intelligente Methode ist. Es erledigt viele nützliche Dinge, einschließlich des Schreibens von Fehlerinformationen in das Protokoll . Im ersten Fall wird geschrieben, dass Objekt A erwartet wurde, aber Objekt B empfangen wurde. Im zweiten Fall wird einfach geschrieben, dass true erwartet wurde .

Wenn Sie Hunderte von Tests haben, insbesondere solche, die auf einem dedizierten Testserver ausgeführt werden, können detaillierte Protokolle sehr hilfreich sein. Ich denke, Sie verstehen, was ich meine.

Beispiel für einen Array-Vergleich:

@Test
public void whenAssertingArraysEquality() {
    char[] expected = {'J','u','n','i','t'};
    char[] actual = "Junit".toCharArray();

    assertArrayEquals(expected, actual);
}

6.3 AssertAll-Methode

Wie oben erwähnt, führt die Assert- Methode nicht nur eine Prüfung durch, sondern schreibt auch viele Informationen zu vergleichbaren Objekten in das Protokoll.

Machen wir einen Vergleich:

Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());

Wenn jedoch einer der Parameter nicht übereinstimmt, werden die übrigen nicht überprüft. Ich möchte aber, dass sie trotzdem auftreten und ihre Ergebnisse im Protokoll aufgezeichnet werden. Wenn aber gleichzeitig mindestens eine Prüfung fehlschlägt, ist der Test immer noch fehlgeschlagen.

Hierfür gibt es eine spezielle Methode - AssertAll() . Als erstes Argument benötigt es einen Kommentar, der in das Protokoll geschrieben wird, und dann eine beliebige Anzahl von Assert-Funktionen.

So würde unser Beispiel damit umgeschrieben werden:

Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
    () -> assertEquals("Washington", address.getCity()),
    () -> assertEquals("Oracle Parkway", address.getStreet()),
    () -> assertEquals("500", address.getNumber())
);

Wenn die Adresse dann falsch ist, wird etwa Folgendes in das Protokoll geschrieben:

	Complex scenario comparison address (3 failures)
	expected: <Washington> but was: <Seattle>
    expected: <Oracle Parkway> but was: <Main Street>
    expected: <500> but was: <5772>

6.4 AssertTimeout-Methode

Erinnern Sie sich an die @Timeout -Annotation ? Dadurch konnte die Ausführungszeit der gesamten Methode gesteuert werden. Manchmal ist es jedoch sinnvoll, die Ausführung eines Teils des Codes innerhalb der Methode einzuschränken. Sie können hierfür „asserTimeout()“ verwenden .

Als erster Parameter wird die Zeit und als zweiter der Code (Funktion) übergeben, der innerhalb der angegebenen Zeit ausgeführt werden muss. Beispiel:

@Test
public void whenAssertingTimeout() {
    assertTimeout(
  	ofSeconds(2),
  	() -> {
    	// pause for one second
    	Thread.sleep(1000);
  	}
	);
}

Die Assert- Klasse verfügt über 12 Varianten der AssertTimeout() -Methode . Wenn Sie mehr darüber erfahren möchten, besuchen Sie bitte die offizielle Dokumentation .

6.5 AssertThrows-Methode

Sehr oft gibt es Situationen, in denen Sie sicherstellen müssen, dass der Code in einer bestimmten Situation die richtige Ausnahme auslöst: Er erkennt einen Fehler und löst die richtige Ausnahme aus. Dies ist eine sehr häufige Situation.

In diesem Fall gibt es eine weitere nützliche Assert- Methode – dies ist AssertThrows() . Das allgemeine Format des Aufrufs ist:

assertThrows(exception , code)

Im Grunde ist sie der Methode „asserTimeout()“ sehr ähnlich , nur dass sie prüft, ob der angegebene Code die richtige Ausnahme auslöst. Beispiel:

@Test
void whenAssertingException() {
    Throwable exception = assertThrows(
  	IllegalArgumentException.class,
  	() -> {
      	throw new IllegalArgumentException("Exception message");
  	}
    );
    assertEquals("Exception message", exception.getMessage());
}