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());
}
GO TO FULL VERSION