6.1 hævder

Asserts er specielle checks , der kan indsættes forskellige steder i koden. Deres opgave er at fastslå, at noget gik galt. Eller rettere sagt for at tjekke, at alt går, som det skal. Dette er "efter behov", og de giver dig mulighed for at indstille det på forskellige måder.

Du er allerede stødt på nogle påstande i koden ovenfor. Den første er at kontrollere objekter for lighed. Hvis objekterne ikke er ens, vil en undtagelse blive kastet, og testen vil mislykkes.

Sammenligningsrækkefølgen er vigtig her , fordi JUnit i den endelige rapport vil skrive noget som "værdi 1 modtaget, men 3 var forventet". Det generelle format for en sådan kontrol er:

assertEquals(standard , meaning)

Eksempel:

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

    assertEquals(expected, actual);
}

6.2 Metoder assertEquals, assertTrue, assertFalse

Nedenfor vil jeg liste de mest populære metoder - påstande. Ved deres navne er det ganske muligt at gætte, hvordan de fungerer. Men jeg vil alligevel skrive en kort forklaring:

assertEquals Kontrollerer, at to objekter er ens
assertArrayEquals Kontrollerer, om to arrays indeholder lige store værdier
assertNotNull Kontrollerer, om argumentet ikke er nul
assertNull Kontrollerer, om argumentet er nul
hævdeNotSame Tjek, at de to argumenter ikke er det samme objekt
hævde Samme Tjek, at de to argumenter er det samme objekt
hævdeSandt Tjek om argumentet er sandt
hævde Falsk Tjekker om argumentet er falsk

Nogle af disse metoder virker overflødige. Hvorfor bruge assertSame(a, b) , når du bare kan skrive assertTrue(a == b) ?

Pointen er, at assert er en meget smart metode. Det gør en masse nyttige ting, herunder at skrive fejlinformation til loggen . I det første tilfælde vil det skrive, at objekt A var forventet, men objekt B blev modtaget. I det andet tilfælde vil det blot skrive, at sandt var forventet .

Når du har hundredvis af tests, især dem, der kører på en dedikeret testserver, kan det være super nyttigt at have detaljerede logfiler. Jeg tror du forstår hvad jeg mener.

Eksempel på sammenligning af matrix:

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

    assertArrayEquals(expected, actual);
}

6.3 assertAll metode

Som nævnt ovenfor udfører assert- metoden ikke kun en kontrol, men skriver også en masse information om sammenlignelige objekter til loggen.

Lad os lave en sammenligning:

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

Men hvis en af ​​parametrene ikke stemmer overens, vil resten ikke blive kontrolleret. Men jeg vil gerne have, at de stadig forekommer, og deres resultater registreres i loggen. Men på samme tid, hvis mindst én kontrol mislykkedes, så mislykkedes testen stadig.

Der er en speciel metode til dette - assertAll() . Som det første argument kræver det en kommentar at blive skrevet til loggen og derefter et hvilket som helst antal hævde funktioner.

Her er hvordan vores eksempel ville blive omskrevet med det:

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

Så hvis adressen er forkert, vil noget som dette blive skrevet til loggen:

	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 metode

Kan du huske @Timeout- annotationen ? Det gjorde det muligt at kontrollere udførelsestiden for hele metoden. Men nogle gange er det nyttigt at sætte begrænsninger på udførelsen af ​​en del af koden inde i metoden. Du kan bruge assertTimeout() til dette .

Tiden passeres som den første parameter, og koden (funktionen), der skal udføres inden for den angivne tid, sendes som den anden. Eksempel:

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

Assert- klassen har 12 varianter af assertTimeout() -metoden . Hvis du vil vide mere om dem, er du velkommen til den officielle dokumentation .

6.5 assertThrows metode

Meget ofte er der situationer, hvor du skal sikre dig, at koden i en bestemt situation kaster den rigtige undtagelse: den registrerer en fejl og kaster den rigtige undtagelse. Dette er en meget almindelig situation.

I dette tilfælde er der en anden nyttig assertmetode - dette er assertThrows() . Det generelle format for dets opkald er:

assertThrows(exception , code)

Grundlæggende ligner den assertTimeout() metoden , kun den kontrollerer, at den angivne kode kaster den rigtige undtagelse. Eksempel:

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