Podem instal·lar la llibreria JUnit mitjançant Maven.
Maven és una eina de gestió de projectes que es basa en un conjunt de normes que defineixen
com s'han de construir i empaquetar els projectes, així com les dependències amb altres projectes o llibreries.
Això fa que siga molt més senzill de gestionar projectes grans,
ja que es pot utilitzar Maven per crear fàcilment una estructura de directoris comuna
i automatitzar tasques com la compilació, validació i empaquetat.
Per poder utilitzar JUnit al nostre projecte, hem d'afegir la llibreria com una dependència:
Obri el fitxer pom.xml que es troba a l'arrel del teu projecte.
Una vegada obert, prem Alt+Insert i selecciona Add dependency.
Tip
El cursor ha d'estar dins de l'etiqueta <project>.
A la finestra, escriu org.junit.jupiter:junit-jupiter a la barra de cerca.
Selecciona la dependència necessària i prem Add per afegir-la.
Note
La versió de JUnit en el moment de la creació d'aquesta guia és la 5.10.0.
No obstant això, la versió pot variar en el futur.
Aquesta acció afegirà al fitxer de configuració de Maven pom.xml un text semblant a:
Ara hem d'aplicar els canvis realitzats a la configuració de Maven. Premeu Ctrl+Maj+O o feu clic a Load Maven Changes
a la notificació que apareix a l'extrem superior dret de l'editor.
En Java, la instrucció assert és una instrucció que s'utilitza per comprovar que una
determinada condició és certa durant l'execució d'una prova unitària.
Si la condició no es compleix, la prova llançarà una excepció (error) del tipus AssertionError.
En JUnit, hi ha molts tipus diferents d'instruccions assert disponibles
per fer verificacions diferents durant l'execució de proves unitàries.
La instrucció assertEquals(expected, actual) s'utilitza per comprovar que dos valor són iguals,
on expected és el valor que s'espera i actual és el valor que has obtingut.
Si expected i actual són iguals, la prova continuarà executant-se.
Si no ho són, la prova fallarà amb una AssertionError.
Important
Aquest mètode utilitza el mètode equals() dels objectes
per determinar si els objectes són iguals o no.
assertEquals(10,3+7),// IntegerassertEquals('b','a'+1),// CharassertEquals(1.5,3.0/2),// DoubleassertEquals(1.5,3.1/2,0.1),// Double with tolerance (delta)assertEquals("HELLO","hello".toUpperCase())// String
En el cas de dels tipus double i float, es pot definir una tolerància (delta):
assertEquals(1.5,3.1/2,0.1),// Double with tolerance (delta)
La instrucció assertTrue(expression) i assertFalse(expression) s'utilitza per comprovar
que una expressió es vertadera o falsa, respectivament. Si no ho és, la prova fallarà.
La instrucció assertNull(obj) i assertNotNull(obj) s'utilitza per comprovar
si un objecte és null o no, respectivament. Si no té el valor corresponent, la prova fallarà.
La instrucció assertSame(obj1, obj2) i assertNotSame(obj1, obj2) s'utilitza per comprovar
si dos objectes son el mateix o no, respectivament. Si no compleixen la condició, la prova fallarà.
Important
Aquest mètode utilitza l'operador ==,
que en els objectes comprova si exactament són el mateix objecte,
és a dir, que la referència en memòria es la mateixa.
La instrucció assertAll(Executable... executables) s'utilitza per comprovar
que tots els assert proporcionats no llancen un error del tipus AssertionError.
En altres paraules, serveix per comprovar que totes les comprovacions
en un cas de prova es compleixen.
Aquesta instrucció és útil, ja que encara que un cas de prova done error,
tots els següents casos de prova també s'executaran.
Cal utilitzar aquesta instrucció quan un únic cas de prova ha de realitzar més d'una comprovació.
assertFalse(1>0);// Aquest cas de prova fallarà, i per tant,assertTrue(1>0);// la següent intrucció no s'executarà
@Test és l'anotació principal de JUnit, que s'utilitza per especificar
quins mètodes són proves. JUnit executarà automàticament tots
els mètodes anotats amb @Test.
L'anotació @DisplayName s'utilitza per especificar un nom personalitzat a
una classe o una prova. Aquest nom serà mostrat en els resultats,
que farà que siga més fàcil identificar la prova i saber quin és el seu propòsit.
Per defecte s'utilitza el nom de la classe o el mètode.
@DisplayName("My custom test class name")publicclassMyTestClass{@DisplayName("My custom test name")@TestpublicvoidmyTestMethod(){// test code here}// Additional test methods}
L'anotació @BeforeAll s'utilitza per especificar el codi que s'executarà una sola vegada
abans que les proves s'executen.
L'anotació @AfterAll s'utilitza per especificar el codi que s'executarà una vegada
tots les proves han acabat.
Aquests mètodes són útils per inicialitzar recursos que s'utilitzen en multiples mètodes,
com una connexió a una base de dades o l'accés a un fitxer compartit.
Important
Aquests mètodes han de ser declarats com a static.
Exemple
importorg.junit.jupiter.api.AfterAll;importorg.junit.jupiter.api.BeforeAll;importorg.junit.jupiter.api.Test;publicclassMyTestClass{@BeforeAllpublicstaticvoidsetUp(){// code that should be run once before all the test methods// this method should be static}@AfterAllpublicstaticvoidtearDown(){// code that should be run once after all the test methods// this method should be static}@Testpublicvoidtest1(){// test code here}@Testpublicvoidtest2(){// test code here}}
En aquest exemple, s'executaran els mètodes en l'ordre:
L'anotació @BeforeEach s'utilitza per especificar el codi que s'executarà
abans que cada test s'execute.
L'anotació @AfterEach s'utilitza per especificar el codi que s'executarà
després que cada test s'execute.
Aquests mètodes són útils per inicialitzar recursos que en un sol test,
com objectes simulats (mock objects) o un fitxer temporal.
Exemple
importorg.junit.jupiter.api.AfterAll;importorg.junit.jupiter.api.BeforeAll;importorg.junit.jupiter.api.Test;publicclassMyTestClass{@BeforeEachpublicvoidsetUp(){// code that should be run before each test method}@AfterEachpublicvoidtearDown(){// code that should be run after each test method}@Testpublicvoidtest1(){// test code here}@Testpublicvoidtest2(){// test code here}}
En aquest exemple, s'executaran els mètodes en l'ordre:
L'anotació @Disabled s'utilitza per deshabilitar un test temporalment.
JUnit ometrà aquest test mentres estiga deshabilitat.
Aquesta anotació pot ser útil, per exemple, quan la prova falla i esteu treballant per arreglar-lo
o quan la funcionalitat que s'està provant encara no està implementada.
D'aquesta manera podeu mantindre la prova en el codi font sense la necessitat de comentar-lo
i també es pot veure el motiu pel qual està desactivat.
importorg.junit.jupiter.api.Disabled;importorg.junit.jupiter.api.Test;publicclassMyTestClass{@Testpublicvoidtest1(){// test code here}@Disabled("This test is currently not working, we are working on it")@Testpublicvoidtest2(){// test code here}}
L'anotació @Nested s'utilitza per definir una classe interna
dins d'una altra classe de tests. D'aquesta manera es poden
agrupar tests que tinguen relació entre ells.
La classe @Nested pot utilitzar les anotacions @BeforeEach, @AfterEach, @BeforeAll i @AfterAll,
igual que qualsevol altra classe i sols s'aplicaran als mètodes continguts en aquesta classe o a les seues subclasses.
importorg.junit.jupiter.api.Nested;importorg.junit.jupiter.api.Test;publicclassMyTestClass{@Testpublicvoidtest1(){// test code here}@NestedpublicclassNestedTestClass{@Testpublicvoidtest2(){// test code here}@Testpublicvoidtest3(){// test code here}}}