![Page 1: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/1.jpg)
Les tests unitaires avec JUnit 5 et Mockito 3
Achref El Mouelhi
Docteur de l’universite d’Aix-MarseilleChercheur en programmation par contrainte (IA)
Ingenieur en genie logiciel
H & H: Research and Training 1 / 103
![Page 2: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/2.jpg)
Plan
1 Introduction
2 Premier exemple
3 Assertions
4 Suppositions
5 Pre/Post test
6 Mockito
H & H: Research and Training 2 / 103
![Page 3: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/3.jpg)
Plan
7 Quelques methodes pour les mocksmockwhen ... thenReturndoReturn ... whenverifytimesatLeastanyanyIntneveronlyinOrderwhen ... thenAnswerdoAnswer ... whenwhen ... thenThrowdoThrow ... whenspy
H & H: Research and Training 3 / 103
![Page 4: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/4.jpg)
Plan
8 Capture d’arguments
9 Quelques annotations pour les mocks@Mock@ExtendWith@InjectMocks@Spy@Captor
10 JUnit et Maven
H & H: Research and Training 4 / 103
![Page 5: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/5.jpg)
Plan
11 Quelques annotations pour les tests@RunWith@DisplayName@Disabled@RepeatedTest@ParameterizedTest@DisabledOnOs et @EnabledOnOs@DisabledOnJre et @EnabledOnJre@DisabledIf et @EnabledIf
12 Recouvrement du code
H & H: Research and Training 5 / 103
![Page 6: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/6.jpg)
© Achref EL MOUELHI ©
Introduction
JUnit
JUnit?
Framework open-source pour Java cree par Kent Beck et Erich Gamma.
Permettant d’automatiser les tests et de s’assurer que le programme repondtoujours aux besoins.
Base sur les assertions qui verifient si les resultats de tests correspondent auxresultats attendus.
Membre de la famille XUnit (CPPUnit pour C++, CUnit pour C, PHPUnit pourPHP...).
Objectif
Trouver un maximum de bugs pour les corriger.
H & H: Research and Training 6 / 103
![Page 7: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/7.jpg)
© Achref EL MOUELHI ©
Introduction
JUnit
JUnit?
Framework open-source pour Java cree par Kent Beck et Erich Gamma.
Permettant d’automatiser les tests et de s’assurer que le programme repondtoujours aux besoins.
Base sur les assertions qui verifient si les resultats de tests correspondent auxresultats attendus.
Membre de la famille XUnit (CPPUnit pour C++, CUnit pour C, PHPUnit pourPHP...).
Objectif
Trouver un maximum de bugs pour les corriger.
H & H: Research and Training 6 / 103
![Page 8: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/8.jpg)
© Achref EL MOUELHI ©
Introduction
JUnit
TestCase (cas de test)
Classe Java
Contenant quelques methodes de test (annotees par @Test)
Permettant de tester le bon fonctionnement d’une classe (entestant ses methodes)
Remarque
Si le test ne detecte pas d’erreur ; il n’y en a pas.
H & H: Research and Training 7 / 103
![Page 9: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/9.jpg)
© Achref EL MOUELHI ©
Premier exemple
JUnit
Etape
Creation d’un Java Project
Creation de deux Package : org.eclipse.main etorg.eclipse.test
Pour chaque classe creee dans org.eclipse.main, on luiassocie une classe de test (dans org.eclipse.test)
On prepare le test et ensuite on le lance : s’il y a une erreur, on lacorrige et on relance le test.
H & H: Research and Training 8 / 103
![Page 10: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/10.jpg)
© Achref EL MOUELHI ©
Premier exemple
JUnit
Creation d’une premiere classe Calcul
package org.eclipse.main;
public class Calcul {public int somme(int x, int y) {return x + y;
}public int division(int x, int y) {if (y == 0)throw new ArithmeticException();
return x / y;}
}
H & H: Research and Training 9 / 103
![Page 11: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/11.jpg)
© Achref EL MOUELHI ©
Premier exemple
JUnit
Pour creer une classe de test
Faire un clic droit sur le package org.eclipse.test
Aller dans New > JUnit Test Case
Saisir le nom CalculTest dans Name
Cocher les 4 cases de Which method stubs would you like tocreate ?
Cliquer sur Browse en face de Class under test
Chercher calcul, selectionner Calcul - org.eclipse.main et valider
Cliquer sur Next puis cocher les cases correspondantes de somme etdivision dans Calcul
Cliquer sur Finish puis sur ok (pour valider Add JUnit 5 library to thebuild path dans Perform the following action:)
H & H: Research and Training 10 / 103
![Page 12: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/12.jpg)
© Achref EL MOUELHI ©
Premier exemple
Le code genere :package org.eclipse.test;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class CalculTest {@BeforeAllstatic void setUpBeforeClass() throws Exception { }@AfterAllstatic void tearDownAfterClass() throws Exception { }@BeforeEachvoid setUp() throws Exception { }@AfterEachvoid tearDown() throws Exception { }@Testvoid testSomme() {
fail("Not yet implemented");}@Testvoid testDivision() {
fail("Not yet implemented");}
}
H & H: Research and Training 11 / 103
![Page 13: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/13.jpg)
© Achref EL MOUELHI ©
Premier exemple
JUnit
Nous parlerons de ces quatre methodes dans une autre section
@BeforeAllstatic void setUpBeforeClass() throws Exception {}
@AfterAllstatic void tearDownAfterClass() throws Exception {}
@BeforeEachvoid setUp() throws Exception {}
@AfterEachvoid tearDown() throws Exception {}
H & H: Research and Training 12 / 103
![Page 14: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/14.jpg)
© Achref EL MOUELHI ©
Premier exemple
JUnit
Pour tester
Faire un clic droit sur le la classe de test
Aller dans Run As > JUnit Test
Resultat
2 Executions : 2 Echecs : car les deux methodes de test sont vides.
H & H: Research and Training 13 / 103
![Page 15: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/15.jpg)
© Achref EL MOUELHI ©
Premier exemple
JUnit
Pour tester
Faire un clic droit sur le la classe de test
Aller dans Run As > JUnit Test
Resultat
2 Executions : 2 Echecs : car les deux methodes de test sont vides.
H & H: Research and Training 13 / 103
![Page 16: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/16.jpg)
© Achref EL MOUELHI ©
Premier exemple
JUnitImplementons testSomme() en ciblant chaque fois les cas particuliers
void testSomme() {Calcul calcul = new Calcul();if (calcul.somme(2, 3) != 5)
fail("faux pour deux entiers positifs");if (calcul.somme(-2, -3) != -5)
fail("faux pour deux entiers negatifs");if (calcul.somme(-2, 3) != 1)
fail("faux pour deux entiers de signe different");if (calcul.somme(0, 3) != 3)
fail("faux pour x nul");if (calcul.somme(2, 0) != 2)
fail("faux pour y nul");if (calcul.somme(0, 0) != 0)
fail("faux pour x et y nuls");}
En testant, plus d’echec pour somme.
H & H: Research and Training 14 / 103
![Page 17: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/17.jpg)
© Achref EL MOUELHI ©
Premier exemple
JUnitImplementons testSomme() en ciblant chaque fois les cas particuliers
void testSomme() {Calcul calcul = new Calcul();if (calcul.somme(2, 3) != 5)
fail("faux pour deux entiers positifs");if (calcul.somme(-2, -3) != -5)
fail("faux pour deux entiers negatifs");if (calcul.somme(-2, 3) != 1)
fail("faux pour deux entiers de signe different");if (calcul.somme(0, 3) != 3)
fail("faux pour x nul");if (calcul.somme(2, 0) != 2)
fail("faux pour y nul");if (calcul.somme(0, 0) != 0)
fail("faux pour x et y nuls");}
En testant, plus d’echec pour somme.H & H: Research and Training 14 / 103
![Page 18: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/18.jpg)
© Achref EL MOUELHI ©
Assertions
JUnit
Remarques
Pour tester une methode, on peut aussi utiliser les assertions ou lesassmptions.
Assertions
Methodes statiques definies dans la classe Assertions.
Permettant de verifier le bon deroulement d’un test : si laverification echoue, l’assertion leve une exception et le testechoue.
Acceptant depuis la version 5 les expressions Lambda.
H & H: Research and Training 15 / 103
![Page 19: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/19.jpg)
© Achref EL MOUELHI ©
Assertions
JUnit
Remarques
Pour tester une methode, on peut aussi utiliser les assertions ou lesassmptions.
Assertions
Methodes statiques definies dans la classe Assertions.
Permettant de verifier le bon deroulement d’un test : si laverification echoue, l’assertion leve une exception et le testechoue.
Acceptant depuis la version 5 les expressions Lambda.
H & H: Research and Training 15 / 103
![Page 20: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/20.jpg)
© Achref EL MOUELHI ©
Assertions
Quelques assertions
assertTrue(condition, message) : permet de verifier que la condition fournie enparametre est vraie.
assertFalse(condition, message) : permet de verifier que la condition fournie enparametre est fausse.
assertEquals(valeur attendue, appel de methode, message) : permet deverifier l’egalite de valeur (sa reciproque est assertNotEquals).
assertSame(objet attendu, objet retourne, message) : permet de verifier siobjet attendu et objet retourne referent le meme objet (sa reciproque estassertNotSame).
assertArrayEquals(tableau attendu, tableau retourne, message) :permet de verifier l’egalite de deux tableaux.
assertIterableEquals(iterable attendu, iterable retourne, message) :permet de verifier l’egalite de deux iterables.
assertNotNull(message, object) permet de verifier, pour les parametres utilises,qu’une methode ne retourne pas la valeur null (sa reciproque est assertNull).
...
H & H: Research and Training 16 / 103
![Page 21: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/21.jpg)
© Achref EL MOUELHI ©
Assertions
JUnit
Remarques
En l’absence d’un message explicite, un message d’erreur pardefaut sera affiche.
Les methodes assertX() peuvent aussi avoir la signaturesuivante : assertX(message, valeurAttendue,appelDeMethodeATester)
H & H: Research and Training 17 / 103
![Page 22: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/22.jpg)
© Achref EL MOUELHI ©
Assertions
Implementons la methode testDivision()
void testDivision() {Calcul calcul = new Calcul();assertFalse(calcul.division(6, 3) == 0, "2 entiers positifs");assertEquals(2, calcul.division(-6, -3), "2 entiers negatifs");assertNotNull(calcul.division(-6, 3), "2 entiers de signe diff");assertTrue(calcul.division(0, 3) == 0, "entier x nul");Throwable e = null;try {
calcul.division(2, 0);}catch (Throwable ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);e = null;try {
calcul.division(0, 0);}catch (Throwable ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);
}
H & H: Research and Training 18 / 103
![Page 23: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/23.jpg)
© Achref EL MOUELHI ©
Assertions
JUnit
Ajouter des valeurs erronees pour avoir un echec
Le message defini sera affiche dans le panneau Failure Trace(vous pouvez cliquer sur l’icone d’ecran, Show Stack Tracein Console View, en face Failure Trace pour visualiser lesdetails de l’erreur dans la console).
Dans ce cas, il faut localiser l’erreur, la corriger et relancer.
H & H: Research and Training 19 / 103
![Page 24: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/24.jpg)
© Achref EL MOUELHI ©
Assertions
Par exemple, les deux premieres assertions ne sont plus correctes
void testDivision() {Calcul calcul = new Calcul();assertFalse(calcul.division(6, 3) == 2, "2 entiers positifs");assertEquals(1, calcul.division(-6, -3), "2 entiers negatifs");assertNotNull(calcul.division(-6, 3), "2 entiers de signe diff");assertTrue(calcul.division(0, 3) == 0, "entier x nul");Throwable e = null;try {
calcul.division(2, 0);}catch (Throwable ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);e = null;try {
calcul.division(0, 0);}catch (Throwable ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);
}
H & H: Research and Training 20 / 103
![Page 25: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/25.jpg)
© Achref EL MOUELHI ©
Assertions
JUnit
Constats
Deux assertions incorrectes mais une seule exception retournee.
Solution
Regrouper les assertions avec assertAll
H & H: Research and Training 21 / 103
![Page 26: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/26.jpg)
© Achref EL MOUELHI ©
Assertions
JUnit
Constats
Deux assertions incorrectes mais une seule exception retournee.
Solution
Regrouper les assertions avec assertAll
H & H: Research and Training 21 / 103
![Page 27: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/27.jpg)
© Achref EL MOUELHI ©
Assertions
JUnit
Regroupons les assertions avec assertAll
void testDivision() {Calcul calcul = new Calcul();assertAll("premier regroupement",() -> assertFalse(calcul.division(6, 3) == 2, "2 entiers positifs"),() -> assertEquals(1, calcul.division(-6, -3), "2 entiers negatifs"),() -> assertNotNull(calcul.division(-6, 3), "2 entiers de signe diff"),() -> assertTrue(calcul.division(0, 3) == 0, "entier x nul")
);Throwable e = null;try {
calcul.division(2, 0);} catch (Throwable ex) {e = ex;
}assertTrue(e instanceof ArithmeticException);e = null;try {
calcul.division(0, 0);} catch (Throwable ex) {e = ex;
}assertTrue(e instanceof ArithmeticException);
}
H & H: Research and Training 22 / 103
![Page 28: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/28.jpg)
© Achref EL MOUELHI ©
Assertions
JUnit
En lancant les tests precedents, les deux echecs sont signales ainsi que le nom duregroupement
org.opentest4j.MultipleFailuresError: premier regroupement (2 failures)org.opentest4j.AssertionFailedError: 2 entiers positifs ==>
expected: <false> but was: <true>org.opentest4j.AssertionFailedError: 2 entiers negatifs ==>
expected: <1> but was: <2>
H & H: Research and Training 23 / 103
![Page 29: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/29.jpg)
© Achref EL MOUELHI ©
Suppositions
JUnit
Assumptions (suppositions)
Methodes statiques definies dans la classe Assumptions.
Permettant de conditionner l’execution d’un bloc de test : sil’evaluation de l’assumption echoue, le test sera desactive sansetre echoue.
H & H: Research and Training 24 / 103
![Page 30: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/30.jpg)
© Achref EL MOUELHI ©
Suppositions
Modifions testDivision() pour que l’ensemble de tests precedents ne soit execute quesi on travaille dans un environnement Windows
void testDivision() {Calcul calcul = new Calcul();assumeTrue(System.getenv("OS").startsWith("Windows"));assertFalse(calcul.division(6, 3) == 0, "2 entiers positifs");assertEquals(2, calcul.division(-6, -3), "2 entiers negatifs");assertNotNull(calcul.division(-6, 3), "2 entiers de signe diff");assertTrue(calcul.division(0, 3) == 0, "entier x nul");Throwable e = null;try {
calcul.division(2, 0);} catch (Throwable ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);e = null;try {
calcul.division(0, 0);} catch (Throwable ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);
}
H & H: Research and Training 25 / 103
![Page 31: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/31.jpg)
© Achref EL MOUELHI ©
Suppositions
ou en utilisant assumingThat() fonctionnant avec une expression Lambda
void testDivision() {Calcul calcul = new Calcul();assumingThat(System.getenv("OS").startsWith("Windows"), () -> {
assertFalse(calcul.division(6, 3) == 0, "2 entiers positifs");assertEquals(2, calcul.division(-6, -3), "2 entiers negatifs");assertNotNull(calcul.division(-6, 3), "2 entiers de signe diff");assertTrue(calcul.division(0, 3) == 0, "entier x nul");Throwable e = null;try {
calcul.division(2, 0);} catch (Throwable ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);e = null;try {
calcul.division(0, 0);} catch (Throwable ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);
});}
H & H: Research and Training 26 / 103
![Page 32: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/32.jpg)
© Achref EL MOUELHI ©
Suppositions
JUnit
Quelques assumptions
assumeTrue()
assumeFalse()
assumeThat()
assumingThat()
assumeNoException()
assumeNotNull() :
H & H: Research and Training 27 / 103
![Page 33: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/33.jpg)
© Achref EL MOUELHI ©
Pre/Post test
JUnit
Dans certains cas
Avant de demarrer un test, il faut faire certains traitements :
instancier un objet de la classe,
se connecter a une base de donnees,
ouvrir un fichier...
Apres le test, il faut aussi fermer certaines ressources : connexion a une base de donnees,socket...
Solution
On peut utiliser les methodes setUp() et tearDown() qui sont respectivement executeesavant et apres l’appel de chaque methode de test.
H & H: Research and Training 28 / 103
![Page 34: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/34.jpg)
© Achref EL MOUELHI ©
Pre/Post test
JUnit
Dans certains cas
Avant de demarrer un test, il faut faire certains traitements :
instancier un objet de la classe,
se connecter a une base de donnees,
ouvrir un fichier...
Apres le test, il faut aussi fermer certaines ressources : connexion a une base de donnees,socket...
Solution
On peut utiliser les methodes setUp() et tearDown() qui sont respectivement executeesavant et apres l’appel de chaque methode de test.
H & H: Research and Training 28 / 103
![Page 35: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/35.jpg)
© Achref EL MOUELHI ©
Pre/Post test
Reprenons les quatre methodes precedentes et modifions le code
@BeforeAllstatic void setUpBeforeClass() throws Exception {System.out.println("BeforeAll");
}
@AfterAllstatic void tearDownAfterClass() throws Exception {System.out.println("AfterAll");
}
@BeforeEachvoid setUp() throws Exception {System.out.println("BeforeEach");
}
@AfterEachvoid tearDown() throws Exception {System.out.println("AfterEach");
}
H & H: Research and Training 29 / 103
![Page 36: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/36.jpg)
© Achref EL MOUELHI ©
Pre/Post test
JUnit
Pour mieux comprendre
Lancer le test JUnit
Le resultat
BeforeAllBeforeEachAfterEachBeforeEachAfterEachAfterAll
H & H: Research and Training 30 / 103
![Page 37: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/37.jpg)
© Achref EL MOUELHI ©
Pre/Post test
JUnit
Pour mieux comprendre
Lancer le test JUnit
Le resultat
BeforeAllBeforeEachAfterEachBeforeEachAfterEachAfterAll
H & H: Research and Training 30 / 103
![Page 38: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/38.jpg)
© Achref EL MOUELHI ©
Pre/Post test
JUnit
Comprenons les annotations de methodes precedentes
@BeforeAll : la methode annotee sera executee seulementavant le premier test
@AfterAll : la methode annotee sera executee seulement apresle dernier test
@BeforeEach : la methode annotee sera executee avant chaquetest
@AfterEach : la methode annotee sera executee apres chaquetest
H & H: Research and Training 31 / 103
![Page 39: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/39.jpg)
© Achref EL MOUELHI ©
Pre/Post test
JUnit
Remarques
@BeforeAll etait @BeforeClass dans JUnit 4.
@AfterAll etait @AfterClass dans JUnit 4.
@BeforeEach etait @Before dans JUnit 4.
@AfterEach etait @After dans JUnit 4.
H & H: Research and Training 32 / 103
![Page 40: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/40.jpg)
© Achref EL MOUELHI ©
Pre/Post test
Utilisons ces methodes pour restructurer la classe CalculTest
class CalculTest {Calcul calcul;@BeforeAllstatic void setUpBeforeClass() throws Exception { }@AfterAllstatic void tearDownAfterClass() throws Exception { }@BeforeEachvoid setUp() throws Exception {
calcul = new Calcul();}@AfterEachvoid tearDown() throws Exception {
calcul = null;}@Testvoid testSomme() {
// le code precedent sans l’instanciation de calcul}@Testvoid testDivision() {
// le code precedent sans l’instanciation de calcul}
}
H & H: Research and Training 33 / 103
![Page 41: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/41.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
Mock ?
Doublure, objet factice (fake object)
permettant de reproduire le comportement d’un objet reel nonimplemente
Mockito?
Framework open-source pour Java
Generateur automatique de doublures
Un seul type de Mock possible et une seule facon de le creer
H & H: Research and Training 34 / 103
![Page 42: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/42.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
Mock ?
Doublure, objet factice (fake object)
permettant de reproduire le comportement d’un objet reel nonimplemente
Mockito?
Framework open-source pour Java
Generateur automatique de doublures
Un seul type de Mock possible et une seule facon de le creer
H & H: Research and Training 34 / 103
![Page 43: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/43.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
Exemple, supposant qu’on
a une interface CalculService ayant une methode carre()
veut developper une methode sommeCarre() dans Calcul quiutilise la methode carre() de cette interface CalculService
H & H: Research and Training 35 / 103
![Page 44: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/44.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
L’interface CalculService
package org.eclipse.main;
public interface CalculService {
public int carre(int x);
}
H & H: Research and Training 36 / 103
![Page 45: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/45.jpg)
© Achref EL MOUELHI ©
Mockito
JUnitLa classe Calcul
package org.eclipse.main;
public class Calcul {CalculService calculService;
public Calcul(CalculService calculService) {this.calculService = calculService;
}
public int sommeCarre(int x, int y) {return somme(calculService.carre(x), calculService.
carre(y));}
public int somme(int x, int y) {return x + y;
}
public int division(int x, int y) {if (y == 0)
throw new ArithmeticException();return x / y;
}}
H & H: Research and Training 37 / 103
![Page 46: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/46.jpg)
© Achref EL MOUELHI ©
Mockito
JUnitPour tester la classe Calcul dans TestCalcul, il faut commencer parinstancier CalculService
class CalculTest {Calcul calcul;CalculService calculService;
@BeforeEachvoid setUp() throws Exception {
calcul = new Calcul(calculService);}
@Testvoid testSommeCarre() {
assertTrue(calcul.sommeCarre(2, 3) == 13, "calculexact");
}// + le code precedent
H & H: Research and Training 38 / 103
![Page 47: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/47.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
En testant, on aura l’erreur suivante
java.lang.NullPointerExceptionat org.eclipse.main.Calcul.sommeCarre(Calcul.java:6)at org.eclipse.test.CalculTest.testSommeCarre(CalculTest.java:26)
Explication
La source de l’erreur est l’appel de la methode carre(x) qui n’est pas implemente.
Pour corriger cette erreur, on peut utiliser les STUB.
STUB (les bouchons en francais) : code qui renvoie le meme resultat pour une methodeinvoquee.
H & H: Research and Training 39 / 103
![Page 48: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/48.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
En testant, on aura l’erreur suivante
java.lang.NullPointerExceptionat org.eclipse.main.Calcul.sommeCarre(Calcul.java:6)at org.eclipse.test.CalculTest.testSommeCarre(CalculTest.java:26)
Explication
La source de l’erreur est l’appel de la methode carre(x) qui n’est pas implemente.
Pour corriger cette erreur, on peut utiliser les STUB.
STUB (les bouchons en francais) : code qui renvoie le meme resultat pour une methodeinvoquee.
H & H: Research and Training 39 / 103
![Page 49: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/49.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
Pour tester la classe Calcul dans TestCalcul, il faut commencer parinstancier un objet d’une classe anonyme implementant CalculService
class CalculTest {Calcul calcul;
CalculService calculService = new CalculService() {
@Overridepublic int carre(int x) {// TODO Auto-generated method stubreturn x * x;
}};
// + le code precedent
}
H & H: Research and Training 40 / 103
![Page 50: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/50.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
Ou en utilisant les expressions Lambda
class CalculTest {Calcul calcul;
CalculService calculService = (int x) -> x * x;
// + le code precedent
}
H & H: Research and Training 41 / 103
![Page 51: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/51.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
En testant
tout se passe bien et le test est passe.
On peut utiliser les mocks
pour creer un objet factice de CalculService.
H & H: Research and Training 42 / 103
![Page 52: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/52.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
En testant
tout se passe bien et le test est passe.
On peut utiliser les mocks
pour creer un objet factice de CalculService.
H & H: Research and Training 42 / 103
![Page 53: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/53.jpg)
© Achref EL MOUELHI ©
Mockito
JUnit
Demarche
Aller danshttps://jar-download.com/artifacts/org.mockito ettelecharger mockito-core
Creer un repertoire lib a la racine du projet
Decompresser l’archive mockito-core et copier les 4 .jardans lib
Ajouter les .jar de lib au path du projet
H & H: Research and Training 43 / 103
![Page 54: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/54.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks mock
JUnit
Commencons par importer mockito dans la classe CalculTest
import static org.mockito.Mockito.*;
Remplacons l’instanciation de CalculService par un mock
CalculService calculService = mock(CalculService.class);
H & H: Research and Training 44 / 103
![Page 55: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/55.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks mock
JUnit
Commencons par importer mockito dans la classe CalculTest
import static org.mockito.Mockito.*;
Remplacons l’instanciation de CalculService par un mock
CalculService calculService = mock(CalculService.class);
H & H: Research and Training 44 / 103
![Page 56: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/56.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenReturn
JUnit
Utilisons when ... thenReturn pour indiquer ce qu’il faut retourner lorsquela methode carre est appelee avec les parametres 2 ou 3
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 45 / 103
![Page 57: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/57.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenReturn
JUnit
Utilisons when ... thenReturn pour indiquer ce qu’il faut retourner lorsquela methode carre est appelee avec les parametres 2 ou 3
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 45 / 103
![Page 58: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/58.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks doReturn ... when
JUnit
Nous pouvons egalement utiliser doReturn ... when de la maniere suivante
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);doReturn(9).when(calculService).carre(3);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 46 / 103
![Page 59: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/59.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks doReturn ... when
JUnit
Nous pouvons egalement utiliser doReturn ... when de la maniere suivante
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);doReturn(9).when(calculService).carre(3);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 46 / 103
![Page 60: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/60.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks doReturn ... when
JUnit
Remarques
when ... thenReturn n’accepte pas les methodes void.
doReturn accepte toutes les methodes quelle que soit la valeurde retour.
H & H: Research and Training 47 / 103
![Page 61: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/61.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks verify
JUnit
Pour verifier que le mock a bien ete appele, on peut utiliser la methode verify
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);when(calculService.carre(4)).thenReturn(16);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService).carre(2);
}
Remarque
Remplacez verify(calculService).carre(2) parverify(calculService).carre(4) et verifiez que le test echoue.
H & H: Research and Training 48 / 103
![Page 62: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/62.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks verify
JUnit
Pour verifier que le mock a bien ete appele, on peut utiliser la methode verify
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);when(calculService.carre(4)).thenReturn(16);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService).carre(2);
}
Remarque
Remplacez verify(calculService).carre(2) parverify(calculService).carre(4) et verifiez que le test echoue.
H & H: Research and Training 48 / 103
![Page 63: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/63.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks verify
JUnit
Et si on n’appelle plus la methode carre() de CalculService dans Calcul
public int sommeCarre(int x, int y) {return somme(x * x, y * y);
}
Testons de nouveau testSommeCarre()
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService).carre(2);
}
H & H: Research and Training 49 / 103
![Page 64: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/64.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks verify
JUnit
Et si on n’appelle plus la methode carre() de CalculService dans Calcul
public int sommeCarre(int x, int y) {return somme(x * x, y * y);
}
Testons de nouveau testSommeCarre()
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService).carre(2);
}
H & H: Research and Training 49 / 103
![Page 65: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/65.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks verify
JUnit
Le resultat est
Wanted but not invoked:calculService.carre(2);-> at org.eclipse.test.CalculTest.testSommeCarre(
CalculTest.java:39)Actually, there were zero interactions with this mock.
Explication
Tout mock cree doit etre invoque.
H & H: Research and Training 50 / 103
![Page 66: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/66.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks verify
JUnit
Le resultat est
Wanted but not invoked:calculService.carre(2);-> at org.eclipse.test.CalculTest.testSommeCarre(
CalculTest.java:39)Actually, there were zero interactions with this mock.
Explication
Tout mock cree doit etre invoque.
H & H: Research and Training 50 / 103
![Page 67: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/67.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks times
JUnit
Pour verifier que carre(2) a ete appele une seule fois, on peut utiliser lamethode times
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, times(1)).carre(2);
}
Remarque
Remplacez times(1) par times(2) et verifiez que le test echoue.
H & H: Research and Training 51 / 103
![Page 68: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/68.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks times
JUnit
Pour verifier que carre(2) a ete appele une seule fois, on peut utiliser lamethode times
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, times(1)).carre(2);
}
Remarque
Remplacez times(1) par times(2) et verifiez que le test echoue.
H & H: Research and Training 51 / 103
![Page 69: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/69.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks atLeast
JUnit
Pour verifier que carre(2) a ete appele au moins une fois, on peut utiliser lamethode atLeast
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, atLeast(1)).carre(2);
}
Remarque
Remplacez atLeast(1) par atLeast(2) et verifiez que le test echoue.
H & H: Research and Training 52 / 103
![Page 70: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/70.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks atLeast
JUnit
Pour verifier que carre(2) a ete appele au moins une fois, on peut utiliser lamethode atLeast
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, atLeast(1)).carre(2);
}
Remarque
Remplacez atLeast(1) par atLeast(2) et verifiez que le test echoue.
H & H: Research and Training 52 / 103
![Page 71: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/71.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks atLeast
JUnit
Autres methodes similaires
atLeastOnce() : au moins une fois .
atMost(n) : au plus n fois.
atMostOnce() : au plus une fois.
...
H & H: Research and Training 53 / 103
![Page 72: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/72.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks any
JUnitPour verifier que carre a ete appele deux fois avec des parametres de typeInteger, on peut utiliser la methode any
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);when(calculService.carre(4)).thenReturn(16);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, times(2)).carre(Mockito.any(Integer.
class));}
Remarque
Remplacez times(2) par times(3) et verifiez que le test echoue.
H & H: Research and Training 54 / 103
![Page 73: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/73.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks any
JUnitPour verifier que carre a ete appele deux fois avec des parametres de typeInteger, on peut utiliser la methode any
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);when(calculService.carre(4)).thenReturn(16);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, times(2)).carre(Mockito.any(Integer.
class));}
Remarque
Remplacez times(2) par times(3) et verifiez que le test echoue.
H & H: Research and Training 54 / 103
![Page 74: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/74.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks anyInt
JUnit
Pour verifier que carre a ete appele deux fois avec des parametres de typeInteger, on peut aussi utiliser la methode anyInt
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);when(calculService.carre(4)).thenReturn(16);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, times(2)).carre(Mockito.anyInt());
}
Remarque
Remplacez times(2) par times(3) et verifiez que le test echoue.
H & H: Research and Training 55 / 103
![Page 75: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/75.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks anyInt
JUnit
Pour verifier que carre a ete appele deux fois avec des parametres de typeInteger, on peut aussi utiliser la methode anyInt
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);when(calculService.carre(4)).thenReturn(16);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, times(2)).carre(Mockito.anyInt());
}
Remarque
Remplacez times(2) par times(3) et verifiez que le test echoue.
H & H: Research and Training 55 / 103
![Page 76: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/76.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks anyInt
JUnit
Autres methodes similaires
anyByte()
anyShort()
anyChar()
anyFloat()
anyDouble()
...
H & H: Research and Training 56 / 103
![Page 77: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/77.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks never
JUnit
Pour verifier que carre(4) n’a jamais ete appele, on peut utiliser la methodenever
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, never()).carre(4);
}
Remarque
Remplacez verify(calculService, never()).carre(4) parverify(calculService, never()).carre(2) et verifiez que le test echoue.
H & H: Research and Training 57 / 103
![Page 78: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/78.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks never
JUnit
Pour verifier que carre(4) n’a jamais ete appele, on peut utiliser la methodenever
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, never()).carre(4);
}
Remarque
Remplacez verify(calculService, never()).carre(4) parverify(calculService, never()).carre(2) et verifiez que le test echoue.
H & H: Research and Training 57 / 103
![Page 79: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/79.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks only
JUnit
Pour verifier si carre() a ete appele une seule fois quel que soit le nombre deparametres, on peut utiliser la methode only
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, only()).carre(4);
}
H & H: Research and Training 58 / 103
![Page 80: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/80.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks inOrder
JUnit
Pour verifier l’ordre d’interactions avec le mock, on peut utiliser la methode inOrder
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");InOrder ordre = Mockito.inOrder(calculService);ordre.verify(calculService).carre(2);ordre.verify(calculService).carre(3);
}
Remarque
Inverser ordre.verify(calculService).carre(2) parordre.verify(calculService).carre(3) et verifiez que le test echoue.
H & H: Research and Training 59 / 103
![Page 81: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/81.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks inOrder
JUnit
Pour verifier l’ordre d’interactions avec le mock, on peut utiliser la methode inOrder
@Testvoid testSommeCarre() {when(calculService.carre(2)).thenReturn(4);when(calculService.carre(3)).thenReturn(9);assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");InOrder ordre = Mockito.inOrder(calculService);ordre.verify(calculService).carre(2);ordre.verify(calculService).carre(3);
}
Remarque
Inverser ordre.verify(calculService).carre(2) parordre.verify(calculService).carre(3) et verifiez que le test echoue.
H & H: Research and Training 59 / 103
![Page 82: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/82.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenAnswer
JUnit
Utilisons when ... thenAnswer pour definir le comportement de la methode simuleetout en pouvant recuperer les parametres et retourner un resultat
@Testvoid testSommeCarre() {when(calculService.carre(Mockito.anyInt())).thenAnswer((invocation) -> {
Integer entier = invocation.getArgument(0);return entier * entier;
});assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 60 / 103
![Page 83: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/83.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenAnswer
JUnit
Utilisons when ... thenAnswer pour definir le comportement de la methode simuleetout en pouvant recuperer les parametres et retourner un resultat
@Testvoid testSommeCarre() {when(calculService.carre(Mockito.anyInt())).thenAnswer((invocation) -> {
Integer entier = invocation.getArgument(0);return entier * entier;
});assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 60 / 103
![Page 84: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/84.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks doAnswer ... when
JUnit
Nous pouvons egalement utiliser doAnswer ... when de la maniere suivante
@Testvoid testSommeCarre() {doAnswer((invocation) -> {Integer entier = invocation.getArgument(0);return entier * entier;
}).when(calculService).carre(Mockito.anyInt());assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 61 / 103
![Page 85: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/85.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks doAnswer ... when
JUnit
Nous pouvons egalement utiliser doAnswer ... when de la maniere suivante
@Testvoid testSommeCarre() {doAnswer((invocation) -> {Integer entier = invocation.getArgument(0);return entier * entier;
}).when(calculService).carre(Mockito.anyInt());assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 61 / 103
![Page 86: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/86.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks doAnswer ... when
JUnit
Remarques
when ... thenAnswer n’accepte pas les methodes void.
doAnswer accepte toutes les methodes quelle que soit la valeurde retour.
H & H: Research and Training 62 / 103
![Page 87: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/87.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenThrow
JUnit
Remarques
Un mock est initialement introduit pour simuler des objetsexternes ou non instanciables (interface, classe abstraite...)
Mais il peut aussi simuler le comportement d’une classe concrete.
H & H: Research and Training 63 / 103
![Page 88: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/88.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenThrow
Considerons la classe Point suivante
public class Point {private double abs;private double ord;
public Point(double abs, double ord) {this.abs = abs;this.ord = ord;
}
public Point deplacerOrd(double d) {ord += d;return this;
}
public void deplacerAbs(double d) {abs += d;
}
public final void deplacer(double d) {abs += d;ord += d;
}}
H & H: Research and Training 64 / 103
![Page 89: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/89.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenThrow
Pour tester la classe Point, commencons par creer la classe PointTest et preparer le mock
@RunWith(JUnitPlatform.class)class PointTest {
Point pointMock = Mockito.mock(Point.class);
@BeforeAllstatic void setUpBeforeClass() throws Exception {}
@AfterAllstatic void tearDownAfterClass() throws Exception {}
@BeforeEachvoid setUp() throws Exception {}
@AfterEachvoid tearDown() throws Exception {}
@Testvoid testDeplacerOrd() {}
@Testvoid testDeplacerAbs() {}
@Testvoid testDeplacer() {}
}
H & H: Research and Training 65 / 103
![Page 90: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/90.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenThrow
JUnit
Utilisons when ... thenThrow pour lever une exception si certains parametres sontpresents
@Testvoid testDeplacerOrd() {
when(pointMock.deplacerOrd(Double.MAX_VALUE)).thenThrow(ArithmeticException.class);
Throwable e = null;try {
pointMock.deplacerOrd(Double.MAX_VALUE);} catch (Exception ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);
}
H & H: Research and Training 66 / 103
![Page 91: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/91.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenThrow
JUnit
Ajoutons l’affichage suivant dans la methode deplacerOrd
public Point deplacerOrd(double d) {System.out.println(d);ord += d;return this;
}
Remarques
En lancant le test, le message ajoute ne s’affiche pas.
En effet, appeler une methode apres un when permet de retourner le resultatindique par thenReturn ou thenThrow.
Le mock renvoie null si la methode appelee n’est pas definie avec un when.
H & H: Research and Training 67 / 103
![Page 92: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/92.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks when ... thenThrow
JUnit
Ajoutons l’affichage suivant dans la methode deplacerOrd
public Point deplacerOrd(double d) {System.out.println(d);ord += d;return this;
}
Remarques
En lancant le test, le message ajoute ne s’affiche pas.
En effet, appeler une methode apres un when permet de retourner le resultatindique par thenReturn ou thenThrow.
Le mock renvoie null si la methode appelee n’est pas definie avec un when.
H & H: Research and Training 67 / 103
![Page 93: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/93.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks doThrow ... when
JUnit
Remarques
when ... thenThrow n’accepte pas les methodes void.
Mais on peut utiliser doThrow.
H & H: Research and Training 68 / 103
![Page 94: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/94.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks doThrow ... when
JUnit
Utilisons doThrow pour lever une exception si certains parametres sont presents pourtester la methode deplacerAbs ne retournant pas de valeurs
@Testvoid testDeplacerAbs() {
doThrow(ArithmeticException.class).when(pointMock).deplacerAbs(Double.MAX_VALUE);
Throwable e = null;try {
pointMock.deplacerAbs(Double.MAX_VALUE);} catch (Exception ex) {
e = ex;}assertTrue(e instanceof ArithmeticException);
}
H & H: Research and Training 69 / 103
![Page 95: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/95.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
JUnit
Remarques
Un mock ne peut jamais simuler une methode finale.
Il ne peut utiliser la version definie dans la classe reelle car ilretourne null si la methode n’est pas mentionnee dans un when.
Solution
Utiliser les espions (Spy).
H & H: Research and Training 70 / 103
![Page 96: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/96.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
JUnit
Remarques
Un mock ne peut jamais simuler une methode finale.
Il ne peut utiliser la version definie dans la classe reelle car ilretourne null si la methode n’est pas mentionnee dans un when.
Solution
Utiliser les espions (Spy).
H & H: Research and Training 70 / 103
![Page 97: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/97.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
JUnit
Spy?
Un spy est un mock partiel cree a partir d’une instance reelle.
Une partie de l’objet sera simulee et une partie utilisera desinvocations de methodes reelles.
Si un spy appelle une methode non mentionnee dans un when,c’est la methode originale definie dans la classe reelle qui seraappelee.
H & H: Research and Training 71 / 103
![Page 98: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/98.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
JUnit
Remplacons la declaration du mock
Point pointMock = mock(Point.class);
Par celle d’un spy construit a partir d’une instance reelle
Point pointMock = Mockito.spy(new Point(2, 2));
Verifiez que les tests precedents passent toujours.
H & H: Research and Training 72 / 103
![Page 99: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/99.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
JUnit
Remplacons la declaration du mock
Point pointMock = mock(Point.class);
Par celle d’un spy construit a partir d’une instance reelle
Point pointMock = Mockito.spy(new Point(2, 2));
Verifiez que les tests precedents passent toujours.
H & H: Research and Training 72 / 103
![Page 100: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/100.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
JUnit
Remplacons la declaration du mock
Point pointMock = mock(Point.class);
Par celle d’un spy construit a partir d’une instance reelle
Point pointMock = Mockito.spy(new Point(2, 2));
Verifiez que les tests precedents passent toujours.
H & H: Research and Training 72 / 103
![Page 101: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/101.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
Definissons le test de la methode finale
@Testvoid testDeplacer() {
Point resultat = new Point(6.0, 6.0);assertTrue(resultat.equals(pointMock.deplacer(4)));
}
Et redefinissons la methode equals dans Point
@Overridepublic boolean equals(Object obj) {
Point p = (Point) obj;return p.abs == abs && p.ord == ord;
}
Verifiez que le test passe correctement.
H & H: Research and Training 73 / 103
![Page 102: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/102.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
Definissons le test de la methode finale
@Testvoid testDeplacer() {
Point resultat = new Point(6.0, 6.0);assertTrue(resultat.equals(pointMock.deplacer(4)));
}
Et redefinissons la methode equals dans Point
@Overridepublic boolean equals(Object obj) {
Point p = (Point) obj;return p.abs == abs && p.ord == ord;
}
Verifiez que le test passe correctement.
H & H: Research and Training 73 / 103
![Page 103: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/103.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
Definissons le test de la methode finale
@Testvoid testDeplacer() {
Point resultat = new Point(6.0, 6.0);assertTrue(resultat.equals(pointMock.deplacer(4)));
}
Et redefinissons la methode equals dans Point
@Overridepublic boolean equals(Object obj) {
Point p = (Point) obj;return p.abs == abs && p.ord == ord;
}
Verifiez que le test passe correctement.
H & H: Research and Training 73 / 103
![Page 104: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/104.jpg)
© Achref EL MOUELHI ©
Quelques methodes pour les mocks spy
JUnit
Remarques
Pour les spy, when ... thenReturn et when ...thenThrow appellent la methode de la classe reelle juste avantque la valeur specifiee ne soit renvoyee. Donc, si la methodeappelee leve une exception, il faut la gerer / la simuler, etc.
doReturn et doThrow n’appelle pas du tout la methode de laclasse reelle.
H & H: Research and Training 74 / 103
![Page 105: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/105.jpg)
© Achref EL MOUELHI ©
Capture d’arguments
JUnit
Reprenons la methode testSommeCarre()
@Testvoid testSommeCarre() {doAnswer((invocation) -> {Integer entier = invocation.getArgument(0);return entier * entier;
}).when(calculService).carre(Mockito.anyInt());assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Question
Comment capturer les arguments utilisees dans une methode simulee?
H & H: Research and Training 75 / 103
![Page 106: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/106.jpg)
© Achref EL MOUELHI ©
Capture d’arguments
JUnit
Reprenons la methode testSommeCarre()
@Testvoid testSommeCarre() {doAnswer((invocation) -> {Integer entier = invocation.getArgument(0);return entier * entier;
}).when(calculService).carre(Mockito.anyInt());assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
}
Question
Comment capturer les arguments utilisees dans une methode simulee?
H & H: Research and Training 75 / 103
![Page 107: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/107.jpg)
© Achref EL MOUELHI ©
Capture d’arguments
JUnit
Reponse
Utiliser ArgumentCaptor
ArgumentCaptor?
utilise avec la methode verify pour capturer les parametrespasses a une methode simulee.
particulierement utile lorsque nous ne pouvons pas acceder a unparametre en dehors de la methode simulee.
H & H: Research and Training 76 / 103
![Page 108: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/108.jpg)
© Achref EL MOUELHI ©
Capture d’arguments
JUnit
Reponse
Utiliser ArgumentCaptor
ArgumentCaptor?
utilise avec la methode verify pour capturer les parametrespasses a une methode simulee.
particulierement utile lorsque nous ne pouvons pas acceder a unparametre en dehors de la methode simulee.
H & H: Research and Training 76 / 103
![Page 109: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/109.jpg)
© Achref EL MOUELHI ©
Capture d’arguments
JUnit
Exemple
@Testvoid testSommeCarre() {ArgumentCaptor<Integer> nbr = ArgumentCaptor.forClass(Integer.class);doAnswer((invocation) -> {
Integer entier = invocation.getArgument(0);return entier * entier;
}).when(calculService).carre(Mockito.anyInt());assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, times(2)).carre(nbr.capture());assertEquals(2, nbr.getAllValues().get(0));assertEquals(3, nbr.getAllValues().get(1));
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 77 / 103
![Page 110: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/110.jpg)
© Achref EL MOUELHI ©
Capture d’arguments
JUnit
Exemple
@Testvoid testSommeCarre() {ArgumentCaptor<Integer> nbr = ArgumentCaptor.forClass(Integer.class);doAnswer((invocation) -> {
Integer entier = invocation.getArgument(0);return entier * entier;
}).when(calculService).carre(Mockito.anyInt());assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, times(2)).carre(nbr.capture());assertEquals(2, nbr.getAllValues().get(0));assertEquals(3, nbr.getAllValues().get(1));
}
Lancez le test et verifiez qu’il se termine correctement.
H & H: Research and Training 77 / 103
![Page 111: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/111.jpg)
© Achref EL MOUELHI ©
Capture d’arguments
JUnit
Explication
ArgumentCaptor<Integer> nbr =ArgumentCaptor.forClass(Integer.class) permet de declarer un capteurd’argument de type Integer.
nbr.capture() permet de capturer les arguments de type entier.
nbr.getAllValues() retourne les arguments captures de type entier.
Remarques
Si une methode prend plusieurs arguments de types differents, alors il faut declarer uncapteur d’arguments par type.
Si le capteur capture une seule valeur, on peut utiliser capteur.getValue().
H & H: Research and Training 78 / 103
![Page 112: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/112.jpg)
© Achref EL MOUELHI ©
Capture d’arguments
JUnit
Explication
ArgumentCaptor<Integer> nbr =ArgumentCaptor.forClass(Integer.class) permet de declarer un capteurd’argument de type Integer.
nbr.capture() permet de capturer les arguments de type entier.
nbr.getAllValues() retourne les arguments captures de type entier.
Remarques
Si une methode prend plusieurs arguments de types differents, alors il faut declarer uncapteur d’arguments par type.
Si le capteur capture une seule valeur, on peut utiliser capteur.getValue().
H & H: Research and Training 78 / 103
![Page 113: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/113.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les mocks @Mock
JUnit
On peut aussi utiliser les annotations pour creer un mock
@MockCalculService calculService;
Remarques
Pour activer l’annotation @Mock, il faut soit :
appeler la methode initMocks (ou openMocks depuis Mockito3).
annoter la classe de test par @ExtendWith.
H & H: Research and Training 79 / 103
![Page 114: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/114.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les mocks @Mock
JUnit
On peut aussi utiliser les annotations pour creer un mock
@MockCalculService calculService;
Remarques
Pour activer l’annotation @Mock, il faut soit :
appeler la methode initMocks (ou openMocks depuis Mockito3).
annoter la classe de test par @ExtendWith.
H & H: Research and Training 79 / 103
![Page 115: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/115.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les mocks @Mock
JUnit
Activons l’annotation @Mock (Pour Mockito 2, remplacez openMocks parinitMocks)
class CalculTest {
Calcul calcul;
@MockCalculService calculService;
@BeforeEachvoid setUp() throws Exception {
MockitoAnnotations.openMocks(this);calcul = new Calcul(calculService);
}
// + le code precedent
H & H: Research and Training 80 / 103
![Page 116: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/116.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les mocks @ExtendWith
JUnit
On peut aussi remplacer l’appel de la methode openMocks parl’annotation @ExtendWith(MockitoExtension.class)
@ExtendWith(MockitoExtension.class)class CalculTest {
Calcul calcul;
@MockCalculService calculService;
@BeforeEachvoid setUp() throws Exception {
calcul = new Calcul(calculService);}
// + le code precedent
H & H: Research and Training 81 / 103
![Page 117: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/117.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les mocks @InjectMocks
JUnit
On peut aussi automatiser l’injection du mock dans le constructeur dela classe Calcul en utilisant l’annotation @InjectMocks
@ExtendWith(MockitoExtension.class)class CalculTest {
@MockCalculService calculService;
@InjectMocksCalcul calcul;
@BeforeEachvoid setUp() throws Exception {}
// + le code precedent
H & H: Research and Training 82 / 103
![Page 118: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/118.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les mocks @Spy
On peut aussi remplacer l’appel de la methode spy par l’annotation @Spy
@ExtendWith(MockitoExtension.class)class PointTest {
@SpyPoint pointMock = new Point(2, 2);
@BeforeAllstatic void setUpBeforeClass() throws Exception {}
@AfterAllstatic void tearDownAfterClass() throws Exception {}
@BeforeEachvoid setUp() throws Exception {}
@AfterEachvoid tearDown() throws Exception {}
// + les tests
H & H: Research and Training 83 / 103
![Page 119: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/119.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les mocks @Captor
JUnitOn peut aussi declarer le capteur avec @Captor
@ExtendWith(MockitoExtension.class)class CalculTest {
@MockCalculService calculService;
@InjectMocksCalcul calcul;
@CaptorArgumentCaptor<Integer> nbr;
@BeforeEachvoid setUp() throws Exception {}
@Testvoid testSommeCarre() {
doAnswer((invocation) -> {Integer entier = invocation.getArgument(0);return entier * entier;
}).when(calculService).carre(Mockito.anyInt());assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");verify(calculService, times(2)).carre(nbr.capture());assertEquals(2, nbr.getAllValues().get(0));assertEquals(3, nbr.getAllValues().get(1));
}
// + les autres tests
H & H: Research and Training 84 / 103
![Page 120: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/120.jpg)
© Achref EL MOUELHI ©
JUnit et Maven
JUnit
Commencons par creer un Java Project avec Maven
Aller dans File > New > Other
Chercher puis selectionner Maven Project
Cliquer sur Next
Choisir maven-archetype-quickstart
Remplir les champs
Group Id avec org.eclipse
Artifact Id avec cours-junit-maven
Package avec org.eclipse.main
H & H: Research and Training 85 / 103
![Page 121: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/121.jpg)
© Achref EL MOUELHI ©
JUnit et Maven
JUnit
Verifier l’existence des deux repertoires
/src/main/java : code source
/src/test/java : code source de test
...
S’il n’y a pas de src/main/java ou src/test/java
Faire clic droit sur le projet
Aller dans Build Path > Configure Build Path...
Cliquer sur Order and Export
Cocher les cases Maven Dependencies et JRE System Library
Cliquer sur Apply and Close
H & H: Research and Training 86 / 103
![Page 122: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/122.jpg)
© Achref EL MOUELHI ©
JUnit et Maven
JUnit
Verifier l’existence des deux repertoires
/src/main/java : code source
/src/test/java : code source de test
...
S’il n’y a pas de src/main/java ou src/test/java
Faire clic droit sur le projet
Aller dans Build Path > Configure Build Path...
Cliquer sur Order and Export
Cocher les cases Maven Dependencies et JRE System Library
Cliquer sur Apply and Close
H & H: Research and Training 86 / 103
![Page 123: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/123.jpg)
© Achref EL MOUELHI ©
JUnit et Maven
JUnit
Ajouter les proprietes suivantes dans la section properties de pom.xml
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><junit-jupiter.version>5.7.0</junit-jupiter.version><junit-platform.version>1.7.0</junit-platform.version><mockito.version>3.7.7</mockito.version>
</properties>
H & H: Research and Training 87 / 103
![Page 124: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/124.jpg)
© Achref EL MOUELHI ©
JUnit et Maven
JUnitAjouter les dependances suivantes dans la section dependencies de pom.xml
<dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-runner</artifactId><version>${junit-platform.version}</version><scope>test</scope>
</dependency>
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>${junit-jupiter.version}</version><scope>test</scope>
</dependency>
dependency><groupId>org.mockito</groupId><artifactId>mockito-junit-jupiter</artifactId><version>${mockito.version}</version><scope>test</scope>
</dependency>
H & H: Research and Training 88 / 103
![Page 125: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/125.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @RunWith
JUnit
Pour tester
Deplacez le package org.eclipse.main du projet precedentdans src/main/java.
Deplacez le package org.eclipse.test danssrc/test/java et renommez le org.eclipse.main.
Annotez les classes de test par@RunWith(JUnitPlatform.class).
H & H: Research and Training 89 / 103
![Page 126: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/126.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @RunWith
JUnit
Ajoutez l’annotation @RunWith(JUnitPlatform.class) a laclasse CalculTest puis lancez le test
package org.eclipse.main;
import org.junit.platform.runner.JUnitPlatform;import org.junit.runner.RunWith;
// + les imports precedents
@ExtendWith(MockitoExtension.class)@RunWith(JUnitPlatform.class)class CalculTest {
// + le code precedent
H & H: Research and Training 90 / 103
![Page 127: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/127.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @DisplayName
JUnit
Pour modifier l’affichage de la classe de test, on utilise @DisplayName
package org.eclipse.main;
import org.junit.jupiter.api.DisplayName;
// + les imports precedents
@DisplayName("Test de la classe Calcul")@ExtendWith(MockitoExtension.class)@RunWith(JUnitPlatform.class)class CalculTest {// + tout le code precedent
H & H: Research and Training 91 / 103
![Page 128: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/128.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @DisplayName
JUnit
@DisplayName peut etre utilisee aussi avec les methodes
@Test@DisplayName("Test de la methode sommeCarre")void testSommeCarre() {
...}
H & H: Research and Training 92 / 103
![Page 129: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/129.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @Disabled
JUnit
Pour desactiver un test, on utilise l’annotation @Disabled (ou@Ignore dans JUnit 4)
@Disabled@Testvoid testSomme() {
...}
H & H: Research and Training 93 / 103
![Page 130: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/130.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @RepeatedTest
JUnit
Utiliser @RepeatedTest pour repeter un test plusieurs fois
@RepeatedTest(3)void testSomme(RepetitionInfo repetitionInfo) {assertNotEquals(7, calcul.somme(repetitionInfo.
getCurrentRepetition(),3));}
Explication
Il faut remplacer @Test par @RepeatedTest.
Pour recuperer l’index de l’iteration courante, on declare un objetde type RepetitionInfo.
H & H: Research and Training 94 / 103
![Page 131: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/131.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @RepeatedTest
JUnit
Utiliser @RepeatedTest pour repeter un test plusieurs fois
@RepeatedTest(3)void testSomme(RepetitionInfo repetitionInfo) {assertNotEquals(7, calcul.somme(repetitionInfo.
getCurrentRepetition(),3));}
Explication
Il faut remplacer @Test par @RepeatedTest.
Pour recuperer l’index de l’iteration courante, on declare un objetde type RepetitionInfo.
H & H: Research and Training 94 / 103
![Page 132: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/132.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @RepeatedTest
JUnit
On peut utiliser @RepeatedTest pour personnaliser le message afficher
@RepeatedTest(value = 3, name = RepeatedTest.LONG_DISPLAY_NAME)void testSomme(RepetitionInfo repetitionInfo) {
assertNotEquals(7, calcul.somme(repetitionInfo.getCurrentRepetition(), 3));
}
H & H: Research and Training 95 / 103
![Page 133: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/133.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @ParameterizedTest
JUnit
Utiliser @ParameterizedTest pour parametrer un test
@DisplayName("Test de la methode somme")@ParameterizedTest@ValueSource(ints = { 2, 3 })void testSomme(int t) {
assertNotEquals(5, calcul.somme(t, 1));}
Explication
Il faut remplacer @Test par @ParameterizedTest.
Cette methode sera testee deux fois : une fois pour la valeur 2 et une fois pour la valeur 3.
@ValueSource indique les valeurs a injecter dans t a chaque appel.
Il existe aussi strings, longs et doubles.
H & H: Research and Training 96 / 103
![Page 134: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/134.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @ParameterizedTest
JUnit
Utiliser @ParameterizedTest pour parametrer un test
@DisplayName("Test de la methode somme")@ParameterizedTest@ValueSource(ints = { 2, 3 })void testSomme(int t) {
assertNotEquals(5, calcul.somme(t, 1));}
Explication
Il faut remplacer @Test par @ParameterizedTest.
Cette methode sera testee deux fois : une fois pour la valeur 2 et une fois pour la valeur 3.
@ValueSource indique les valeurs a injecter dans t a chaque appel.
Il existe aussi strings, longs et doubles.
H & H: Research and Training 96 / 103
![Page 135: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/135.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @ParameterizedTest
JUnit
Pour utiliser l’annotation @ParameterizedTest, il faut ajouter ladependance suivante :
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>${junit-jupiter.version}</version><scope>test</scope>
</dependency>
H & H: Research and Training 97 / 103
![Page 136: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/136.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @ParameterizedTest
JUnit
Annotations a utiliser avec @ParameterizedTest
@ValueSource
@EnumSource
@CsvFileSource
@MethodSource
...
H & H: Research and Training 98 / 103
![Page 137: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/137.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @DisabledOnOs et @EnabledOnOs
JUnitPour activer ou desactiver un test selon le systeme d’exploitation, onutilise soit @DisabledOnOs soit @EnabledOnOs
@Test@DisabledOnOs(MAC)void testSommeCarre() {
...}
Il faut importer la constante MAC
import static org.junit.jupiter.api.condition.OS.MAC;
Autres constantes possibles : LINUX, WINDOWS
H & H: Research and Training 99 / 103
![Page 138: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/138.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @DisabledOnOs et @EnabledOnOs
JUnitPour activer ou desactiver un test selon le systeme d’exploitation, onutilise soit @DisabledOnOs soit @EnabledOnOs
@Test@DisabledOnOs(MAC)void testSommeCarre() {
...}
Il faut importer la constante MAC
import static org.junit.jupiter.api.condition.OS.MAC;
Autres constantes possibles : LINUX, WINDOWS
H & H: Research and Training 99 / 103
![Page 139: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/139.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @DisabledOnOs et @EnabledOnOs
JUnitPour activer ou desactiver un test selon le systeme d’exploitation, onutilise soit @DisabledOnOs soit @EnabledOnOs
@Test@DisabledOnOs(MAC)void testSommeCarre() {
...}
Il faut importer la constante MAC
import static org.junit.jupiter.api.condition.OS.MAC;
Autres constantes possibles : LINUX, WINDOWS
H & H: Research and Training 99 / 103
![Page 140: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/140.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @DisabledOnJre et @EnabledOnJre
JUnitPour activer ou desactiver un test selon la version de JRE, on utilise soit@DisabledOnJre soit @EnabledOnJre
@Test@DisabledOnOs(MAC)@EnabledOnJre(JAVA_10)void testSommeCarre() {
...}
Il faut importer la constante JAVA 10
import static org.junit.jupiter.api.condition.JRE.JAVA_10;
Autres constantes possibles : JAVA 8, JAVA 9
H & H: Research and Training 100 / 103
![Page 141: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/141.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @DisabledOnJre et @EnabledOnJre
JUnitPour activer ou desactiver un test selon la version de JRE, on utilise soit@DisabledOnJre soit @EnabledOnJre
@Test@DisabledOnOs(MAC)@EnabledOnJre(JAVA_10)void testSommeCarre() {
...}
Il faut importer la constante JAVA 10
import static org.junit.jupiter.api.condition.JRE.JAVA_10;
Autres constantes possibles : JAVA 8, JAVA 9
H & H: Research and Training 100 / 103
![Page 142: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/142.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @DisabledOnJre et @EnabledOnJre
JUnitPour activer ou desactiver un test selon la version de JRE, on utilise soit@DisabledOnJre soit @EnabledOnJre
@Test@DisabledOnOs(MAC)@EnabledOnJre(JAVA_10)void testSommeCarre() {
...}
Il faut importer la constante JAVA 10
import static org.junit.jupiter.api.condition.JRE.JAVA_10;
Autres constantes possibles : JAVA 8, JAVA 9
H & H: Research and Training 100 / 103
![Page 143: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/143.jpg)
© Achref EL MOUELHI ©
Quelques annotations pour les tests @DisabledIf et @EnabledIf
JUnit
Pour activer ou desactiver un test selon la valeur d’un test logique (on peutmeme utiliser une expression reguliere), on utilise soit @DisabledIf soit@EnabledIf
@Test@DisabledOnOs(MAC)@DisabledIf("2 * 3 > 4")void testSommeCarre() {
...}
H & H: Research and Training 101 / 103
![Page 144: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/144.jpg)
© Achref EL MOUELHI ©
Recouvrement du code
JUnit
Objectif
On veut verifier si nos tests couvrent l’integralite de notre code.
Ou s’il y a des zones inaccessibles dans notre code.
Pour cela, il faut installer un plugin Eclipse EclEmma.
Aller dans Help > Install New Software > Add.
Saisir EclEmma dans Name et http://update.eclemma.org/ dans Location.
Cocher la case EclEmma et cliquer sur Next.
Terminer l’installation et redemarrer Eclipse.
H & H: Research and Training 102 / 103
![Page 145: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/145.jpg)
© Achref EL MOUELHI ©
Recouvrement du code
JUnit
Objectif
On veut verifier si nos tests couvrent l’integralite de notre code.
Ou s’il y a des zones inaccessibles dans notre code.
Pour cela, il faut installer un plugin Eclipse EclEmma.
Aller dans Help > Install New Software > Add.
Saisir EclEmma dans Name et http://update.eclemma.org/ dans Location.
Cocher la case EclEmma et cliquer sur Next.
Terminer l’installation et redemarrer Eclipse.
H & H: Research and Training 102 / 103
![Page 146: Les tests unitaires avec JUnit 5 - LIS lab · JUnit Pour creer une classe de test´ Faire un clic droit sur le package org.eclipse.test Aller dans New > JUnit Test Case Saisir le](https://reader036.vdocument.in/reader036/viewer/2022071217/604d5e561ab7532cae4f327a/html5/thumbnails/146.jpg)
© Achref EL MOUELHI ©
Recouvrement du code
JUnit
Pour tester le recouvrement du code
Aller dans Window > Show View > Other ....
Saisir Coverage et valider.
Aller dans Run.
Cliquer sur Coverage et verifier si votre code est bien couvert parles tests.
H & H: Research and Training 103 / 103