Beweren dat een uitzondering wordt geworpen in JUnit 4 en 5

1. Inleiding

In deze korte tutorial bekijken we hoe we kunnen testen of er een uitzondering is gegenereerd met behulp van de JUnit-bibliotheek.

We zullen er natuurlijk voor zorgen dat we zowel de JUnit 4- als de JUnit 5-versie behandelen.

2. JUnit 5

JUnit 5 Jupiter assertions API introduceert de assertThrows methode voor het doen gelden van uitzonderingen.

Dit neemt het type van de verwachte uitzondering en een Uitvoerbaar functionele interface waar we de te testen code kunnen doorgeven via een lambda-expressie:

@Test openbare leegte whenExceptionThrown_thenAssertionSucceeds () {uitzondering uitzondering = assertThrows (NumberFormatException.class, () -> {Integer.parseInt ("1a");}); String verwachteMessage = "Voor invoerstring"; String actualMessage = exception.getMessage (); assertTrue (actualMessage.contains (verwachtMessage)); }

Als de verwachte uitzondering wordt gegenereerd,assertThrows geeft de uitzondering terug, waardoor we ook op het bericht kunnen claimen.

Bovendien is het belangrijk om dat op te merken deze bewering is vervuld wanneer de ingesloten code een uitzondering van het type genereert NullPointerException of een van de daarvan afgeleide typen.

Dit betekent dat als we slagen Uitzondering als het verwachte uitzonderingstype, zorgt elke opgeworpen uitzondering ervoor dat de bewering slaagt sinds Uitzondering is het supertype voor alle uitzonderingen.

Als we de bovenstaande test wijzigen om een RuntimeException, dit gaat ook over:

@Test openbare leegte whenDerivedExceptionThrown_thenAssertionSucceds () {Uitzonderingsuitzondering = assertThrows (RuntimeException.class, () -> {Integer.parseInt ("1a");}); String verwachteMessage = "Voor invoertekenreeks"; String actualMessage = exception.getMessage (); assertTrue (actualMessage.contains (verwachtMessage)); }

De assertThrows () methode maakt meer fijnmazige controle mogelijk voor uitzonderingsbevestigingslogica omdat wehet rond specifieke delen van de code.

3. JUnit 4

Als we JUnit 4 gebruiken, kunnen we dat eenvoudig doen gebruik de verwacht attribuut van de @Test annotatie om te verklaren dat we verwachten dat een uitzondering overal in de geannoteerde testmethode wordt gegenereerd.

Het resultaat is dat wanneer de test wordt uitgevoerd, deze mislukt als de opgegeven uitzondering niet wordt gegenereerd en wordt doorgegeven als deze wordt gegenereerd:

@Test (verwacht = NullPointerException.class) public void whenExceptionThrown_thenExpectationSatisfied () {String test = null; test.length (); }

In dit voorbeeld hebben we verklaard dat we verwachten dat onze testcode zal resulteren in een NullPointerException.

Dit is voldoende als we alleen maar willen beweren dat er een uitzondering wordt gegenereerd.

Als we enkele andere eigenschappen van de uitzondering moeten verifiëren, kunnen we de Verwachte uitzondering regel.

Laten we een voorbeeld bekijken van het verifiëren van het bericht eigenschap van een uitzondering:

@Rule openbaar ExpectedException exceptionRule = ExpectedException.none (); @Test openbare leegte whenExceptionThrown_thenRuleIsApplied () {exceptionRule.expect (NumberFormatException.class); exceptionRule.expectMessage ("For input string"); Integer.parseInt ("1a"); }

In het bovenstaande voorbeeld declareren we eerst de ExpectedException regel. Vervolgens stellen we in onze test dat de code die probeert een Geheel getal waarde resulteert in een NumberFormatException met de boodschap "For input string".

4. Conclusie

In dit artikel hebben we het beweren van uitzonderingen behandeld met zowel JUnit 4 als JUnit 5.

De volledige broncode voor de voorbeelden is beschikbaar op GitHub.