6.1 afirmă

Asserturile sunt verificări speciale care pot fi inserate în diferite locuri din cod. Sarcina lor este să stabilească dacă ceva a mers prost. Sau, mai degrabă, să verificăm că totul merge așa cum trebuie. Acesta este „așa cum este necesar” și vă permit să îl setați în diferite moduri.

Ați întâlnit deja câteva afirmații în codul de mai sus. Prima este verificarea egalității obiectelor. Dacă obiectele nu sunt egale, se va arunca o excepție și testul va eșua.

Ordinea comparației este importantă aici , deoarece JUnit în raportul final va scrie ceva de genul „valoarea 1 primită, dar 3 era așteptată”. Formatul general pentru o astfel de verificare este:

assertEquals(standard , meaning)

Exemplu:

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

    assertEquals(expected, actual);
}

6.2 Metode assertEquals, assertTrue, assertFalse

Mai jos voi enumera cele mai populare metode - afirmații. După numele lor este foarte posibil să ghicim cum funcționează. Dar voi scrie oricum o scurtă explicație:

assertEquals Verifică dacă două obiecte sunt egale
assertArrayEquals Verifică dacă două matrice conțin valori egale
assertNotNull Verifică dacă argumentul nu este nul
assertNull Verifică dacă argumentul este nul
assertNotSame Verificați dacă cele două argumente nu sunt același obiect
assertSame Verificați dacă cele două argumente sunt același obiect
assertTrue Verifică dacă argumentul este adevărat
assertFalse Verifică dacă argumentul este fals

Unele dintre aceste metode par redundante. De ce să folosiți assertSame(a, b) când puteți scrie doar assertTrue(a == b) ?

Ideea este că afirmarea este o metodă foarte inteligentă. Face o mulțime de lucruri utile, inclusiv scrierea informațiilor de eroare în jurnal . În primul caz, va scrie că obiectul A era așteptat, dar obiectul B a fost primit. În al doilea caz, va scrie pur și simplu că adevărat a fost așteptat .

Când aveți sute de teste, în special cele care rulează pe un server de testare dedicat, a avea jurnalele detaliate poate fi de mare ajutor. Cred că înțelegi ce vreau să spun.

Exemplu de comparare a matricei:

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

    assertArrayEquals(expected, actual);
}

6.3 metoda assertAll

După cum s-a menționat mai sus, metoda de afirmare nu numai că efectuează o verificare, ci și scrie o mulțime de informații despre obiecte comparabile în jurnal.

Hai sa facem o comparatie:

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

Dar dacă unul dintre parametri nu se potrivește, restul nu va fi verificat. Dar aș dori ca acestea să apară în continuare și rezultatele lor să fie înregistrate în jurnal. Dar, în același timp, dacă cel puțin o verificare a eșuat, atunci testul a eșuat totuși.

Există o metodă specială pentru aceasta - assertAll() . Ca prim argument, este nevoie de un comentariu pentru a fi scris în jurnal, și apoi de orice număr de funcții assert.

Iată cum ar fi rescris exemplul nostru cu el:

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

Apoi, dacă adresa este incorectă, ceva de genul acesta va fi scris în jurnal:

	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

Vă amintiți adnotarea @Timeout ? A permis controlul timpului de execuție al întregii metode. Dar uneori este util să stabiliți restricții asupra execuției unei părți a codului din cadrul metodei. Puteți utiliza assertTimeout() pentru aceasta .

Timpul este trecut ca prim parametru, iar codul (funcția) care trebuie executat în timpul specificat este trecut ca al doilea. Exemplu:

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

Clasa Assert are 12 variante ale metodei assertTimeout() . Dacă doriți să aflați mai multe despre ele, bine ați venit la documentația oficială .

6.5 metoda assertThrows

Foarte des există situații în care trebuie să te asiguri că într-o anumită situație codul aruncă excepția corectă: detectează o eroare și aruncă excepția potrivită. Aceasta este o situație foarte comună.

În acest caz, există o altă metodă utilă de afirmare - aceasta este assertThrows() . Formatul general al apelului său este:

assertThrows(exception , code)

Practic, este foarte asemănătoare cu metoda assertTimeout() , doar că verifică dacă codul specificat aruncă excepția corectă. Exemplu:

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