6.1 hävdar

Asserts är specialcheckar som kan infogas på olika ställen i koden. Deras uppgift är att fastställa att något gick fel. Eller rättare sagt att kolla att allt går som det ska. Detta är "efter behov" och de låter dig ställa in det på olika sätt.

Du har redan stött på några påståenden i koden ovan. Den första är att kontrollera objekt för jämlikhet. Om objekten inte är lika, kommer ett undantag att kastas och testet misslyckas.

Jämförelsesordningen är viktig här , eftersom JUnit i slutrapporten kommer att skriva något i stil med "värde 1 mottaget, men 3 förväntades". Det allmänna formatet för en sådan kontroll är:

assertEquals(standard , meaning)

Exempel:

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

    assertEquals(expected, actual);
}

6.2 Metoder assertEquals, assertTrue, assertFalse

Nedan kommer jag att lista de mest populära metoderna - påståenden. Med deras namn är det fullt möjligt att gissa hur de fungerar. Men jag ska skriva en kort förklaring ändå:

assertEquals Kontrollerar att två objekt är lika
assertArrayEquals Kontrollerar om två arrayer innehåller lika värden
hävdaNotNull Kontrollerar om argumentet inte är null
hävdaNull Kontrollerar om argumentet är null
hävdaNotSame Kontrollera att de två argumenten inte är samma objekt
hävda Samma Kontrollera att de två argumenten är samma objekt
hävdaTrue Kontrollerar om argumentet är sant
hävdaFalse Kontrollerar om argumentet är falskt

Vissa av dessa metoder verkar överflödiga. Varför använda assertSame(a, b) när du bara kan skriva assertTrue(a == b) ?

Poängen är att hävda är en väldigt smart metod. Det gör många användbara saker, inklusive att skriva felinformation till loggen . I det första fallet kommer det att skriva att objekt A förväntades, men objekt B togs emot. I det andra fallet kommer det helt enkelt att skriva att sant förväntades .

När du har hundratals tester, särskilt de som körs på en dedikerad testserver, kan det vara till stor hjälp att ha detaljerade loggar. Jag tror du förstår vad jag menar.

Exempel på arrayjämförelse:

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

    assertArrayEquals(expected, actual);
}

6.3 assertAll-metoden

Som nämnts ovan utför assertmetoden inte bara en kontroll, utan skriver också mycket information om jämförbara objekt till loggen.

Låt oss göra en jämförelse:

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

Men om en av parametrarna inte matchar, kommer resten inte att kontrolleras. Men jag skulle vilja att de fortfarande förekommer och deras resultat registreras i loggen. Men samtidigt, om minst en kontroll misslyckades, så misslyckades testet fortfarande.

Det finns en speciell metod för detta - assertAll() . Som det första argumentet krävs en kommentar för att skrivas till loggen, och sedan valfritt antal hävda funktioner.

Så här skulle vårt exempel skrivas om med det:

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

Om adressen är felaktig kommer något i stil med detta att skrivas till 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-metod

Kommer du ihåg @Timeout -kommentaren ? Det gjorde det möjligt att kontrollera exekveringstiden för hela metoden. Men ibland är det användbart att sätta restriktioner för exekvering av någon del av koden inuti metoden. Du kan använda assertTimeout() för detta .

Tiden skickas som den första parametern och koden (funktionen) som måste exekveras inom den angivna tiden skickas som den andra. Exempel:

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

Klassen Assert har 12 varianter av metoden assertTimeout() . Om du vill lära dig mer om dem, välkommen till den officiella dokumentationen .

6.5 assertThrows-metoden

Mycket ofta finns det situationer när du behöver försäkra dig om att koden i en viss situation ger rätt undantag: den upptäcker ett fel och kastar rätt undantag. Detta är en mycket vanlig situation.

I det här fallet finns det en annan användbar assertmetod - det här är assertThrows() . Det allmänna formatet för samtalet är:

assertThrows(exception , code)

I grund och botten är den väldigt lik assertTimeout()- metoden , bara den kontrollerar att den angivna koden ger rätt undantag. Exempel:

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