6.1 beweert

Asserts zijn speciale controles die op verschillende plaatsen in de code kunnen worden ingevoegd. Hun taak is om vast te stellen dat er iets mis is gegaan. Of beter gezegd, om te controleren of alles naar wens verloopt. Dit is "naar behoefte" en u kunt het op verschillende manieren instellen.

U bent al enkele beweringen tegengekomen in de bovenstaande code. De eerste is het controleren van objecten op gelijkheid. Als de objecten niet gelijk zijn, wordt er een uitzondering gegenereerd en mislukt de test.

De volgorde van vergelijking is hier belangrijk , omdat JUnit in het eindrapport iets zal schrijven als "waarde 1 ontvangen, maar 3 werd verwacht". Het algemene formaat voor een dergelijke controle is:

assertEquals(standard , meaning)

Voorbeeld:

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

    assertEquals(expected, actual);
}

6.2 Methoden assertEquals, assertTrue, assertFalse

Hieronder zal ik de meest populaire methoden opsommen - beweringen. Door hun namen is het heel goed mogelijk om te raden hoe ze werken. Maar ik zal toch een korte uitleg schrijven:

assertEquals Controleert of twee objecten gelijk zijn
assertArrayEquals Controleert of twee arrays gelijke waarden bevatten
assertNotNull Controleert of het argument niet null is
assertNull Controleert of het argument null is
assertNotSame Controleer of de twee argumenten niet hetzelfde object zijn
beweren hetzelfde Controleer of de twee argumenten hetzelfde object zijn
bewerenWaar Controleert of het argument waar is
bewerenFalse Controleert of het argument onwaar is

Sommige van deze methoden lijken overbodig. Waarom assertSame(a, b) gebruiken als je assertTrue(a == b) gewoon kunt schrijven ?

Het punt is dat beweren een zeer slimme methode is. Het doet veel nuttige dingen, waaronder het schrijven van foutinformatie naar het logboek . In het eerste geval zal het schrijven dat object A werd verwacht, maar object B is ontvangen.In het tweede geval zal het gewoon schrijven dat waar werd verwacht .

Als je honderden tests hebt, vooral die op een speciale testserver, kan het hebben van gedetailleerde logboeken super handig zijn. Ik denk dat je begrijpt wat ik bedoel.

Voorbeeld van array-vergelijking:

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

    assertArrayEquals(expected, actual);
}

6.3 assertAll-methode

Zoals hierboven vermeld, voert de assert- methode niet alleen een controle uit, maar schrijft ook veel informatie over vergelijkbare objecten naar het logboek.

Laten we een vergelijking maken:

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

Maar als een van de parameters niet overeenkomt, wordt de rest niet gecontroleerd. Maar ik zou graag willen dat ze nog steeds voorkomen en dat hun resultaten worden vastgelegd in het logboek. Maar tegelijkertijd, als ten minste één controle mislukte, mislukte de test nog steeds.

Hiervoor is een speciale methode - assertAll() . Als eerste argument is er een opmerking nodig om naar het logboek te schrijven, en vervolgens een willekeurig aantal assert-functies.

Hier is hoe ons voorbeeld ermee zou worden herschreven:

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

Als het adres dan onjuist is, wordt er zoiets als dit naar het logboek geschreven:

	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-methode

Herinner je je de @Timeout- annotatie nog ? Het maakte het mogelijk om de uitvoeringstijd van de hele methode te regelen. Maar soms is het handig om beperkingen in te stellen voor de uitvoering van een deel van de code binnen de methode. U kunt hiervoor assertTimeout() gebruiken .

Als eerste parameter wordt de tijd doorgegeven en als tweede de code (functie) die binnen de opgegeven tijd moet worden uitgevoerd. Voorbeeld:

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

De klasse Assert heeft 12 varianten van de methode assertTimeout() . Als u er meer over wilt weten, welkom bij de officiële documentatie .

6.5 assertThrows-methode

Heel vaak zijn er situaties waarin u ervoor moet zorgen dat de code in een bepaalde situatie de juiste uitzondering genereert: het detecteert een fout en genereert de juiste uitzondering. Dit is een veel voorkomende situatie.

In dit geval is er nog een handige assert- methode : assertThrows() . Het algemene formaat van zijn oproep is:

assertThrows(exception , code)

In wezen lijkt het erg op de assertTimeout() methode , alleen wordt gecontroleerd of de opgegeven code de juiste uitzondering genereert. Voorbeeld:

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