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());
}