JUnit Eeldatava erandi test: @Test(oodatav)
โก Nutikas kokkuvรตte
JUnit Eranditestimine kinnitab, et meetod viskab vea, mille see peaks viskama, kasutades @Test annotatsiooni valikulist oodatavat parameetrit JUnit 4 ja meetod assertThrows JUnit 5.
JUnit annab vรตimaluse tracerandi ja ka selleks, et kontrollida, kas kood viskab oodatud erandi vรตi mitte.
JUnit 4 pakub lihtsat ja loetavat viisi erandite testimiseks. Vรตite kasutada jรคrgmist:
- Valikuline parameeter (eeldatav) @Testi annotatsioonja
- Et tracTeabe saamiseks saab kasutada funktsiooni โfail()โ.
Kui testimine erandi korral peate tagama, et erandiklass, mille te selles valikulises parameetris pakute, @Testi annotatsioon on sama, mille meetod tegelikult viskab. Seda seetรตttu, et ootate meetodilt, mida kasutate, erandit. รผksuse testimine; muidu meie JUnit test ebaรตnnestuks.
Nรคide: @Test(oodatav = IllegalArgumentException.class)
Parameetri โoodatavโ abil saate mรครคrata erandi nime, mille meie test vรตib visata. รlaltoodud nรคites kasutate โEbaseaduslik argumendi erandโ, mille test viskab vรคlja, kui arendaja kasutab lubamatut argumenti.
Nรคide funktsiooni @Test(oodatav) kasutamisest
Saame aru erandite testimisest, luues Java klass meetodiga, mis viskab erandSa kรคsitled seda ja paned selle proovitunnis proovile. Mรตtle JUnitMessage.java, millel on meetod matemaatilise tehte sooritamiseks. 14. real olev jagamine jagab nulliga, seega meetod viskab alati vรคlja โArithmeticExceptioniโ. Vaata allpool:
package guru99.junit; public class JUnitMessage{ private String message; public JUnitMessage(String message) { this.message = message; } public void printMessage(){ System.out.println(message); int divide=1/0; } public String printHiMessage(){ message="Hi!" + message; System.out.println(message); return message; } }
Code Selgitus:
- Code Rida 7: Parameetritega konstruktori loomine koos vรคlja initsialiseerimisega.
- Code Rida 11-14: Matemaatilise tehte meetodi loomine.
- Code Rida 18: Teise meetodi loomine sรตnumi printimiseks.
- Code Rida 20: Uue stringi loomine sรตnumi printimiseks.
- Code Rida 22: 20. real loodud uue sรตnumi printimine.
Loome รผlaltoodu jaoks testklassi Java klass erandi kontrollimiseks.
Vaadake allpool olevat testiklassi, mis testib รผlaltoodud kรคsuga visatud erandit (siin ArithmeticException). Java klass:
AirthematicTest.java
Allolev ekraanipilt nรคitab sama testi redaktoris, kus fail on salvestatud nimega AirthematicTest1 ja oodatav parameeter on 13. real esile tรตstetud:
package guru99.junit; import static org.junit.Assert.assertEquals; import org.junit.Test; public class AirthematicTest { public String message = "Saurabh"; JUnitMessage junitMessage = new JUnitMessage(message); @Test(expected = ArithmeticException.class) public void testJUnitMessage(){ System.out.println("Junit Message is printing "); junitMessage.printMessage(); } @Test public void testJUnitHiMessage(){ message="Hi!" + message; System.out.println("Junit Message is printing "); assertEquals(message, junitMessage.printHiMessage()); } }
Code Selgitus:
- Code Rida 13: Kasutame testi loomiseks @Test annotatsiooni. รlaltoodud klassi meetodi kรคivitamisel kutsub see esile matemaatilise tehte. Siin oodatakse ArithmeticException'i, seega loetlete selle parameetrina @Test'is.
- Code Rida 17: Funktsiooni printMessage() kรคivitamine JUnitSรตnum.java.
- Code Rida 21-22: Uue testimismeetodi loomine Hi-teate kontrollimiseks, seekord ilma oodatava parameetrita.
Klassis on kaks testimismeetodit, seega รผhe kรคivitamisega kรคivitatakse mรตlemad: see, mis ootab ArithmeticException'i, ja see, mis esitab tagastatud stringile kinnituse.
Mรคrge: See nรคide liigub algmaterjalis kolme nime all โ loendis nimetatakse klassiks AirthematicTest, redaktori ekraanipildil kuvatakse AirthematicTest1 ja tulemuste vaates kuvatakse JunitTestExample. Kood on kรตigis identne; erineb ainult failinimi.
Teostame selle ja kontrollime tulemust. JUnit vaata allpool olevaid aruandeid jooksva kohta JunitTestExample.java.
Vรคljund:
Siin on vรคljund, mis nรคitab edukat testi ilma tรตrgeteta trace, nagu allpool nรคidatud:
Mรตlemad meetodid on rohelised. Esimene lรคheb lรคbi, kuna deklareeritud ArithmeticException saabus ja teine โโlรคheb lรคbi, kuna tagastatud string sobis kokku. Kui jagamist poleks tehtud, JUnit esimene meetod oleks nurjunud teatega โOodatav erand: java.lang.ArithmeticExceptionโ.
Kolm viisi erandi testimiseks JUnit 4
Oodatav parameeter on kolmest lรผhim JUnit 4 idioomi, aga see pole alati รตige. Tabel vรตrdleb neid kahe valikut otsustava kรผsimuse osas: kas sa saad sรตnumi kohta vรคita ja kas sa tead, millise rea viskas?
| Lรคhenemine | Kinnitab sรตnumit? | Paneb viskejoone paika? | Parim on |
| @Test(eeldatav = X.klass) | Ei | Ei โ meetodi iga rida vรตib visata | Lรผhikesed testid, kus oluline on ainult erandi tรผรผp. |
| proovi / ebaรตnnestu() / pรผรผa kinni | Jah, pรผรผdeploki sees | Jah โ jรคlgitakse ainult valvega kรตnet | Testid, mis peavad kontrollima sรตnumit vรตi selle pรตhjust. |
| @Rule ExpectedException | Jah, lรคbi expectMessage() funktsiooni | Ei | Pรคrandversioonid on juba reeglitele รผles ehitatud. |
Sissejuhatuses mainitud fail() idioom nรคeb vรคlja selline. Kui kutse ei anna tulemust, siis fail() kรคivitub ja test annab sinu kirjutatud teate:
@Test public void testDivideByZero() { try { junitMessage.printMessage(); fail("Expected an ArithmeticException"); } catch (ArithmeticException e) { assertEquals("/ by zero", e.getMessage()); } }
ExpectedException reegel asub nende kahe vahel. See aegus aastal JUnit 4.13 jรคrgmisena kirjeldatud assertThrows meetodi kasuks, seega uus JUnit 4 testi ei tohiks seda omaks vรตtta.
Kuidas testida erandeid JUnit 5 funktsiooniga assertThrows()
JUnit 5 eemaldab @Testist oodatava parameetri tรคielikult. Jupiter varustab assertThrows(), mis vรตtab erandiklassi ja testitavat koodi sisaldava lambda. See tagastab pรผรผtud erandi, seega saab sรตnumi, pรตhjuse ja mis tahes kohandatud vรคlja hiljem esitada.
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; public class AirthematicJupiterTest { JUnitMessage junitMessage = new JUnitMessage("Saurabh"); @Test public void testJUnitMessage() { ArithmeticException thrown = assertThrows( ArithmeticException.class, () -> junitMessage.printMessage()); assertEquals("/ by zero", thrown.getMessage()); } }
Kolm omavahel seotud vรคiteid tรคiendada perekonda:
- assertThrows aktsepteerib erandi tรผรผpi vรตi selle mis tahes alamklassi.
- assertThrowsExactly lรผkkab alamklassi tagasi, seega lรคbib ainult nimetatud tรผรผp.
- assertDoesNotThrow esitab vastupidise ootuse, et plokk lรตpeb puhtalt.
. JUnit Sellel lehel olev 4 kood tรถรถtab endiselt JUnit Platvorm lรคbi vana mootori, seega ei pea projekti migreerimise ajal tรถรถtamiseks midagi รผlaltoodut รผmber kirjutama.
Levinud vead erandite testimisel JUnit
Erandtestid ebaรตnnestuvad vรคhestel รคratuntavatel viisidel. Igas reas on nimetatud sรผmptom, pรตhjus ja lahendus.
| Sรผmptom | Pรตhjus | Mรครคrama |
| Oodatav erand: java.lang.ArithmeticException | Meetod viidi lรตpule ilma viskamiseta. | Kontrollige, kas sisend on tรตesti vigane, seejรคrel kรคivitage uuesti. |
| Test lรคbis, aga vale joon viskas | Oodatav parameeter jรคlgib kogu meetodit, sealhulgas seadistamist. | Liiguta seadistus vรคlja vรตi lรผlitu รผhe kutse jooksul assertThrows'ile. |
| Redaktoris olev tรถรถtlemata erandi tรผรผp | Visatakse kontrollitud erand, aga seda ei deklareerita kunagi. | Lisa testimismeetodi signatuurile visked. |
| Test lรคbis alamklassi, mida sa ei kavatsenud | assertThrows aktsepteerib nimetatud tรผรผbi alamklasse. | Range tรผรผbivaste saamiseks kasutage assertThrowsExactly . |
| oodatud atribuut ei ole kehtiv | Test kompileeriti Jupiteri @Test annotatsiooni suhtes. | Impordi org.junit.Test faili jaoks JUnit 4 vรตi liigu assertThrows'i (vรตi assertViskete) sooritamiseks. |
Viimane rida on see, mis tabab enamiku inimesi migratsiooni keskel, sest mรตlemad annotatsioonid kannavad nime @Test ja ainult import eristab neid. Keeping รผks JUnit versioon testjuhtum Klass vรคldib tervet probleemide klassi.



