• GL&IHM
  • 2016-2017

Contraintes à respecter

  • utiliser un IDE (Netbeans ou eclipse) pour développer;
  • vos classes de test ne doivent pas être mélangées aux autres classes;
  • utiliser Junit 4;
  • utiliser java 8 (nécessaire notamment pour le type Optional<>);
  • utiliser la forge de l’université (https://www-apps.univ-lehavre.fr/forge).

Présentation du projet

On souhaite développer une application permettant de gérer une bibliothèque. Pour ce faire, il faudra notamment représenter les livres, les auteurs, les adhérents, et le nombre d’exemplaires de chaque livre dont dispose la bibliothèque.

À titre d’exemple, vous sont aussi donnés des codes pour les classes Adherent et AdherentTest.

Démarrage du projet

Fork

Les sources du projet se trouve sur la forge de l’université dans un projet dont on n’a que les droits en lecture. On doit faire un fork du projet pour en obtenir une copie que l’on peut modifier à volonté.

Chaque partie implémenté et fonctionnelle (une méthode, un test) doit faire l’objet d’un commit avec un message que explique clairement ce qui est ajouté au dépôt.

Le projet à forker se trouve ici : https://www-apps.univ-lehavre.fr/forge/pigne/TP-Junit.git

Après avoir fait un fork du projet vous disposez de votre propre projet : https://www-apps.univ-lehavre.fr/forge/VOTRE_LOGIN/TP-Junit.git

Clone

C’est avec Eclipse que l’on va importer le projet nouvellement créé : menu “File” > “Import” > “Git/Projets from Git” > “Clone URI”

Import des dépendances

Une fois l’import terminé il y a des erreurs. C’est normal, il manque des dépendances. Il faut télécharger Junit et l’ajouter comme dépendance.

Télécharger Junit (il y a 2 fichiers au format jar: junit.jar et hamcrest-core.jar) dans un sous dossier lib de votre projet.

Ajouter les 2 fichiers JAR comme dépendances dans éclipse : Clic-droit sur le projet > “Properties” > “Java Build Path” > onglet “Libraries” > bouton “Add JARs”.

Intégration continue

Le projet contient un fichier .gitlab-ci.yml qui décrit les tests a effectuer sur un serveur d’intégration continue. La forge est équipée d’un tel serveur qui va être exécuté après chaque publication GIT.

Observer l’onglet pipeline dnas l’interface Web de la forge après avoir fait des commits.

Partie A: livres et auteurs

Présentation

Un livre a obligatoirement un titre, mais pas forcément d’auteur. Par contre, il peut avoir plusieurs auteurs. Concernant les auteurs, leur nom est obligatoire, mais pas le prénom. Pour éviter ce genre d’erreurs, les constructeurs des classes Livre et Auteur sont susceptibles de lever des exceptions (de types respectifs TitreRequisException et NomRequisException). Le code des classes d’exception (TitreRequisException et NomRequisException) vous est donné. On vous donne également le code des classes AuteurTest et Livre.

Travail demandé

  1. Écrivez la classe Auteur afin que les tests de la classe AuteurTest réussissent tous.
  2. Écrivez la classe LivreTest afin de vérifier les cas de test suivants:
    • l’affichage rendu pour le livre Les 3 Mousquetaires, d’Alexandre Dumas, doit être : “Les 3 Mousquetaires [Alexandre Dumas]
    • l’affichage rendu pour le livre Ma Vérité, dont l’auteur est inconnu, doit être: “Ma Vérité
    • l’affichage rendu pour le livre Design Patterns: Elements of Reusable Object-Oriented Software, de Erich Gamma, John Vlissides, Ralph Johnson et Richard Helm doit être: “Design Patterns: Elements of Reusable Object-Oriented Software [Erich Gamma, John Vlissides, Ralph Johnson, Richard Helm]

Partie B: Bibliothèque

Présentation

La classe Bibliotheque permet de représenter le stock de chaque livre dont dispose la bibliothèque. Vous pourrez noter que cette classe implante le design pattern Singleton: il ne peut exister qu’une seule instance de cette classe, et la référence vers cette unique instance s’obtient grâce à la méthode getInstance() de la classe Bibliotheque.

Pour gérer le stock de livre, la classe Bibiotheque propose notamment deux méthodes, addExemplaire() et delExemplaire() qui permettent respectivement d’ajouter et supprimer un exemplaire d’un livre donné. La méthode delExemplaire() peut lever une ExemplaireInexistantException s’il n’y a aucun exemplaire du livre en question.

Pour tester cette classe, on va passer par une classe BibliothequeTest dont le squelette vous est donné.

Travail demandé

La classe BibliothequeTest va utiliser les tests paramètres pour vérifier que le résultat d’ajouts et suppressions successifs d’exemplaires de 3 livres particuliers fonctionne bien.

Version 1 : uniquement des cas corrects

On n’envisage que des cas dans lesquels aucune suppression invalide n’est effectuée. Du coup, la méthode fournissant la liste des cas de test devra, pour chaque cas de test, proposer une liste d’« ordres » et le stock résultat.

Un ordre sera de la forme [a|d][0..2], où a veut dire « add » et d « delete », et où le nombre précise l’indice du livre concerné dans la variable de classe livres.

Ainsi, la liste ["a0", "a1", "d0"] signifie qu’on ajoute un exemplaire du livre 0, puis 1 du livre 1, puis qu’on supprime un exemplaire du livre 0.

Le stock résultat, sous la forme d’un «Map», précisera, pour chacun des livres de la variable livres, le nombre d’exemplaire en stock à l’issue des différents ordres donnés.

Complétez la classe BibliothequeTest pour que les suites d’ordre suivantes soient :

["a0", "a1", "a0"]
["a0", "a1", "a2"]
["a0", "a0", "a1", "d0"]

Version 2: cas corrects et cas erronés (exercice avancé)

On souhaite également pouvoir tester des suites d’ordre erronées, c’est-à-dire dans lesquels on tente d’enlever un exemplaire pour un livre dont il ne reste plus d’exemplaire. Pour ce faire, la méthode qui génère les cas de test devra rajouter un troisième paramètre spécifiant s’il s’agit d’un cas correct ou non (dans ce dernier cas, le paramètre précisant l’état du stock pourra être laissé à null).

Il faut alors développer une méthode de test dévolue aux tests corrects et une autre méthode dévolue aux tests erronés. Cela pourra être fait au moyen de la méthode de classe assumeThat de la classe org.junit.Assume.