6.1 twierdzi
Asserts to specjalne kontrole , które można wstawiać w różnych miejscach kodu. Ich zadaniem jest ustalenie, że coś poszło nie tak. A raczej sprawdzić, czy wszystko idzie tak, jak powinno. Jest to „w razie potrzeby” i pozwalają ustawić to na różne sposoby.
W powyższym kodzie napotkałeś już pewne asercje. Pierwszym z nich jest sprawdzanie obiektów pod kątem równości. Jeśli obiekty nie są równe, zostanie zgłoszony wyjątek i test zakończy się niepowodzeniem.
Kolejność porównywania jest tutaj istotna , ponieważ JUnit w raporcie końcowym napisze coś w rodzaju „otrzymano wartość 1, ale oczekiwano 3”. Ogólny format takiego czeku to:
assertEquals(standard , meaning)
Przykład:
@Test
public void whenAssertingEquality () {
String expected = "3.1415";
String actual = "3";
assertEquals(expected, actual);
}
6.2 Metody assertEquals, assertTrue, assertFalse
Poniżej wymienię najpopularniejsze metody - asercje. Po ich nazwach całkiem możliwe jest odgadnięcie, jak działają. Ale i tak napiszę krótkie wyjaśnienie:
twierdząRówna się | Sprawdza, czy dwa obiekty są równe |
---|---|
assertArrayEquals | Sprawdza, czy dwie tablice zawierają równe wartości |
assertNotNull | Sprawdza, czy argument nie jest pusty |
stwierdzaćNull | Sprawdza, czy argument jest pusty |
twierdzą, że nie to samo | Sprawdź, czy te dwa argumenty nie są tym samym obiektem |
twierdzą to samo | Sprawdź, czy oba argumenty są tym samym obiektem |
twierdzeniePrawda | Sprawdza, czy argument jest prawdziwy |
twierdzićFałsz | Sprawdza, czy argument jest fałszywy |
Niektóre z tych metod wydają się zbędne. Po co używać assertSame(a, b) skoro możesz po prostu napisać assertTrue(a == b) ?
Chodzi o to, że assert jest bardzo inteligentną metodą. Robi wiele przydatnych rzeczy, w tym zapisuje informacje o błędach do dziennika . W pierwszym przypadku napisze, że oczekiwano obiektu A, ale otrzymano obiekt B. W drugim przypadku napisze po prostu, że oczekiwano prawdy .
Kiedy masz setki testów, zwłaszcza tych uruchomionych na dedykowanym serwerze testowym, posiadanie szczegółowych dzienników może być bardzo pomocne. Myślę, że rozumiesz, co mam na myśli.
Przykład porównania tablicy:
@Test
public void whenAssertingArraysEquality() {
char[] expected = {'J','u','n','i','t'};
char[] actual = "Junit".toCharArray();
assertArrayEquals(expected, actual);
}
6.3 Metoda assertAll
Jak wspomniano powyżej, metoda assert nie tylko wykonuje sprawdzenie, ale również zapisuje do dziennika wiele informacji o porównywalnych obiektach.
Zróbmy porównanie:
Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());
Ale jeśli jeden z parametrów nie pasuje, reszta nie zostanie sprawdzona. Ale chciałbym, aby nadal występowały, a ich wyniki były zapisywane w dzienniku. Ale jednocześnie, jeśli co najmniej jedna kontrola się nie powiodła, test nadal się nie powiódł.
Jest na to specjalna metoda - assertAll() . Jako pierwszy argument potrzebny jest komentarz, który ma zostać zapisany w dzienniku, a następnie dowolna liczba funkcji assert.
Oto jak nasz przykład zostałby przepisany z tym:
Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
() -> assertEquals("Washington", address.getCity()),
() -> assertEquals("Oracle Parkway", address.getStreet()),
() -> assertEquals("500", address.getNumber())
);
Następnie, jeśli adres jest nieprawidłowy, w dzienniku zostanie zapisane coś takiego:
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 Metoda assertTimeout
Pamiętasz adnotację @Timeout ? Pozwoliło to na kontrolę czasu wykonania całej metody. Ale czasami warto ustawić ograniczenia dotyczące wykonywania jakiejś części kodu wewnątrz metody. Możesz użyć do tego funkcji assertTimeout() .
Jako pierwszy parametr przekazywany jest czas, a jako drugi kod (funkcja), który musi zostać wykonany w określonym czasie. Przykład:
@Test
public void whenAssertingTimeout() {
assertTimeout(
ofSeconds(2),
() -> {
// pause for one second
Thread.sleep(1000);
}
);
}
Klasa Assert ma 12 wariantów metody assertTimeout() . Jeśli chcesz dowiedzieć się o nich więcej, zapraszamy do oficjalnej dokumentacji .
6.5 Metoda assertThrows
Bardzo często zdarzają się sytuacje, w których trzeba się upewnić, że w danej sytuacji kod rzuci właściwy wyjątek: wykryje błąd i zgłosi właściwy wyjątek. To bardzo częsta sytuacja.
W tym przypadku istnieje inna przydatna metoda assert - jest to assertThrows() . Ogólny format jego wezwania to:
assertThrows(exception , code)
Zasadniczo jest bardzo podobna do metody assertTimeout() , tylko sprawdza, czy określony kod zgłasza właściwy wyjątek. Przykład:
@Test
void whenAssertingException() {
Throwable exception = assertThrows(
IllegalArgumentException.class,
() -> {
throw new IllegalArgumentException("Exception message");
}
);
assertEquals("Exception message", exception.getMessage());
}