TP Mock. On veut modéliser un jeu de casino : le jeu de la boule.



Documents pareils
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Programmer en JAVA. par Tama

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Comedy Magic vous présente l'animation Casino Factice

flamber fructifier vente aux enchères les croupiers expliquent les règles tous les accessoires Durée des jeux : 1h30 2h30

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Chapitre 10. Les interfaces Comparable et Comparator 1

Corrigé des exercices sur les références

Package Java.util Classe générique

REGLEMENT DES JEUX PARTOUCHE IMAGES (Serveur vocal et Internet)

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Projet de programmation (IK3) : TP n 1 Correction

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Roulette, Black-jack, Boule, Chuck a luck, Roue de la fortune et Triche... Un classique indémodable de l animation événementielle.

Auto-évaluation Programmation en Java

Corrigés des premiers exercices sur les classes

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

TP1 : Initiation à Java et Eclipse

TD/TP PAC - Programmation n 3

Premiers Pas en Programmation Objet : les Classes et les Objets

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Programmation en Java IUT GEII (MC-II1) 1

Applet pour visualiser les variables «automate» notifiées

Tp 1 correction. Structures de données (IF2)

Programmation par les Objets en Java

Programmation Objet - Cours II

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Fluctuation d une fréquence selon les échantillons - Probabilités

Plateforme PAYZEN. Définition de Web-services

Héritage presque multiple en Java (1/2)

Exercices sur les interfaces

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

TD3: tableaux avancées, première classe et chaînes

Environnements de développement (intégrés)

.NET - Classe de Log

JEUX DE CASINO challenges possibles a partir de 10 ANS utilisation en intérieur

Chapitre 2. Classes et objets

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Langage Java. Classe de première SI

Programmation Par Objets

Programmation Orientée Objet Java

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Les probabilités. Chapitre 18. Tester ses connaissances

Java Licence Professionnelle CISII,

TD/TP PAC - Programmation n 3

Programmation par composants (1/3) Programmation par composants (2/3)

Définition des Webservices Ordre de paiement par . Version 1.0

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Application 1- VBA : Test de comportements d'investissements

F. Barthélemy. 17 mai 2005

Poker. A rendre pour le 25 avril

Dossier projet isn 2015 par Victor Gregoire

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Paginer les données côté serveur, mettre en cache côté client

Analyse Combinatoire

Utilisation d objets : String et ArrayList

RMI le langage Java XII-1 JMF

1. Installation d'un serveur d'application JBoss:

TP architecture N-tiers en Java EE ou Java EE, Android : la synthèse. Le serveur GereCompteBancaireServlet

TP SIN Programmation sur androïde Support : eclipse

2. Comprendre les définitions de classes

Plan du cours. Historique du langage Nouveautés de Java 7

Généralités sur le Langage Java et éléments syntaxiques.

I. Introduction aux fonctions : les fonctions standards

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

INITIATION AU LANGAGE JAVA

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

Examen Médian - 1 heure 30

Programmation C++ (débutant)/instructions for, while et do...while

TP, première séquence d exercices.

Chapitre 2 Devine mon nombre!

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Objets et Programmation. origine des langages orientés-objet

POKER ET PROBABILITÉ

Une introduction à la technologie EJB (2/3)

Cours 1: Java et les objets

CCI Génie Logiciel UFR - IMA. Objectifs du cours d'aujourd'hui. Génie Logiciel Validation par le test. Qu est-ce que tester un programme?

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Recherche dans un tableau

Programmation avec des objets : Cours 7. Menu du jour

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Remote Method Invocation (RMI)

Cours de Systèmes d Exploitation

Chapitre VI- La validation de la composition.

Application web de gestion de comptes en banques

Synchro et Threads Java TM

Copyright / 2014 Éditions Stratégies et développement Siège Social 20 Rue du Béguinage Crespin

Exercices sur le chapitre «Probabilités»

S initier aux probabilités simples «Question de chance!»

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

TP : Gestion d une image au format PGM

Exercices de dénombrement

Transcription:

TP Mock Pour faire ce TP il faut récupérer la "bibliothèque" mockito-all-x.x.x.jar. Vous pouvez la trouver à partir de https://code.google.com/p/mockito/downloads/list (pour mockito- 1.9.5.zip). Anciennement on l'avait à partir du site mockito.org. On veut modéliser un jeu de casino : le jeu de la boule. Règle du jeu : Le jeu de la boule est un jeu de casino simplifié du jeu de la roulette. Il utilise les chiffres de 1 à 9. Le joueur qui joue fait un pari en misant une somme. Il est possible de miser sur rouge, noir, manque, passe, pair ou impair. Les chiffres 1, 3, 7, 9 sont impairs. Les chiffres 2, 4, 6, 8 sont pairs. Les chiffres 1, 3, 6, 8 sont noirs. Les chiffres 2, 4, 7, 9 sont rouges. Les chiffres 1, 2, 3, 4 sont manques ("on a manqué de dépasser 5"). Les chiffres 6, 7, 8, 9 sont passes ("on a dépassé 5"). Ces chances sont des chances simples : si la chance simple misée sort, le joueur gagne une fois la mise (qui lui est restituée), sinon la mise est perdue. Le chiffre 5 n'est ni pair, ni impair, ni manque, ni passe, ni rouge, ni noir. Si le 5 sort, la mise jouée sur une chance simple est perdue. Le joueur peut miser sur un numéro. Si celui-ci sort, le joueur gagne 7 fois la mise qui lui est restitutée sinon la mise est perdue. Un joueur peut évidemment miser sur plusieurs cases (et même sur rouge et noir!). Il ne peut miser que des quantités entières (des jetons de valeur entière en euro). Pour modéliser ce jeu on utilise aux moins deux classes : la classe Joueur qui modélise un... joueur et la CroupierBoule qui modélise le gestionnaire du jeu de la boule : le croupier. La classe CroupierBoule possède la méthode public int getnumsorti() qui retourne le numéro sorti. On a donc : TP sur les Mocks (JUnit) 1/7 Jean-Marc Farinone

Développement de la classe à isoler (la classe Joueur) et de son mock associé 1 ) Faut il développer ce logiciel avec seulement ces deux classes? Penser qu'on nous demandera sûrement un jour de faire de même avec le jeu de la roulette. Indiquer alors la (es) partie(s) logicielle(s) manquante(s). Quel est le principe de génie logiciel orienté objet utilisé ici? Il ne faut pas faire le logiciel avec seulement des classes : il faut abstraire les fonctionnalités et les placer dans des interfaces Java. Les fonctionnalités du casino sont mises dans l'interface CasinoInterface suivante : public interface CasinoInterface { // Ce que doit rendre comme service un casino // (indiquer le numéro sorti, indiquer les gains et perte, etc.) Cette interface sera implémentée par les classes CroupierBoule, CroupierRoulette, etc. Le principe de génie logiciel orienté objet que nous illustrons ici est l'injection de dépendance. 2 ) Un joueur est lié au casino et c'est le casino qui lui indique combien il a gagné ou perdu. Il peut savoir quel numéro est sorti en le demandant au casino (ou au représentant du casino). La classe Joueur possède donc les méthodes : public int agagneouperdu() { // demander au casino combien le joueur a gagné ou perdu et retourne ce gain // ou perte public int getnumerosorti() { // demander au casino le numéro sorti Ecrire la classe Joueur. C'est la classe à tester et on veut l'isoler de la classe qui modélise le casino (son mock). Coder ces deux méthodes de sorte qu'elles demandent leur résultat au représentant du casino. De ce fait toutes les décisions, le numéro sorti, les gains ou pertes des joueurs, plus tard les mises sur les diverses cases, sont prises par le représentant du casino : le joueur ne fait que les demandes. Finalement utilise t-on la classe CroupierBoule? Voici la classe Joueur : package jeu.boule; public class Joueur { private CasinoInterface lecasino; public void setlecasino(casinointerface lecasino) { this.lecasino = lecasino; TP sur les Mocks (JUnit) 2/7 Jean-Marc Farinone

public CasinoInterface getlecasino() { return lecasino; public int agagneouperdu() { return lecasino.gainouperte(); public int getnumerosorti() { return lecasino.getnumsorti(); Comme on peut le voir on n'utilise pas la classe CroupierBoule mais son abstraction l'interface CasinoInterface. 3 ) La classe de test (en JUnit 3.x) qui teste la classe Joueur doit être : public class TestDuJeu extends TestCase { private Joueur lejoueur; private CasinoInterface ladoublure; public void setup() { lejoueur = new Joueur(); ladoublure = mock(casinointerface.class); lejoueur.setlecasino(ladoublure); public void testgagne() { // On suppose que le joueur n'a joué que // sur le 8 avec 3 jetons et que le 8 sort System.out.println("Le joueur n'a joué que sur le 8 avec 3 jetons et le 8 est sorti"); when(ladoublure.getnumsorti()).thenreturn(8); when(ladoublure.gainouperte()).thenreturn(21); int gagneouperdu = lejoueur.agagneouperdu(); System.out.println("Le joueur a gagné : " + gagneouperdu + " parce que le numéro sorti est : " + lejoueur.getnumerosorti()); assertequals(21, gagneouperdu); System.out.println("fin de testgagne"); public void testperdu() { // On suppose que le joueur n'a joué que sur le 8 // avec 3 jetons et que le 9 est sorti System.out.println("Le joueur n'a joué que sur le 8 avec 3 jetons et le 9 est sorti"); when(ladoublure.getnumsorti()).thenreturn(9); when(ladoublure.gainouperte()).thenreturn(-3); int gagneouperdu = lejoueur.agagneouperdu(); System.out.println("Le joueur a gagné : " + gagneouperdu + " parce que le numéro sorti est : " + lejoueur.getnumerosorti()); assertequals(-3, gagneouperdu); System.out.println("fin de testperdu"); TP sur les Mocks (JUnit) 3/7 Jean-Marc Farinone

Ecrire cette classe de test. Lancer le test. La classe qui lance le test est celle ci dessus et elle est entièrement donnée. On a construit un mock qui concrétise une abstraction du casino est qui fonctionne correctement en supposant les mises du Joueur et le numéro sorti. 4 ) Concevoir d'autres jeux de test. Il suffit de suivre le plan de la classe précédente avec d'autres mises et d'autres numéros sortis par le jeu de la boule. Remarque : Il faut être conscient que nous n'avons pas fait grand chose! On a testé une classe (Joueur) qui utilise essentiellement une classe externe qui est, dans l'exercice, représentée par un mock et qui donc renvoie des résultats justes (ils ont été codés dans le mock). Mais : 1 ) On veut illustrer les mocks dans cet exercice 2 ) Le codage de la classe externe est proposée en bonus dans la suite de l'exercice. Ces remarques sont peut être décevantes mais elles sont exactes. D'ailleurs pour s'en convaincre voir le code complet de la classe CroupierBoule en bonus ci dessus : il n'est pas complètement trivial. Bonus (sans les mocks) : implémentation de la classe CroupierBoule 5 ) On veut enrichir le représentant du casino des méthodes : public void addmisesimple(string st, Integer i); public void addmisenumero(integer numero, Integer quantite); public void construitresultat(); Les méthodes addxxx() permettent à un joueur de miser. Elles seront appelées par les méthodes public void depotmisesimple(string nommise, int quantite) et public void depotmisenumero(int numero, int quantite) du joueur. La méthode construitresultat() retourne le numéro "choisi" (sorti). Ecrire la classe CroupierBoule. Cette classe construit le résultat du tirage du numéro, stocke les mises sur le tapis d'un seul joueur (elle devra être plus fournie pour plusieurs joueurs plus tard), calcule et retourne les gains et pertes du joueur par sa méthode public int gainouperte(). Cette classe peut commencer par : public class CroupierBoule implements CasinoInterface { private HashMap<String, Integer> lesmisessimples = new HashMap<String, Integer>(); private HashMap<Integer, Integer> lesnumeros = new HashMap<Integer, Integer>(); private int resultat; TP sur les Mocks (JUnit) 4/7 Jean-Marc Farinone

S'en servir dans un test (sans les mocks) pour vérifier qu'un joueur ayant misé : 3 sur le numéro 8 3 sur le numéro 9 5 sur le noir 2 sur pair 15 sur passe a gagné 40 lorsque le numéro 8 est sorti. Si le numéro 5 était sorti, ce joueur aurait perdu 28. Le code de la classe CroupierBoule est : import java.util.hashmap; import java.util.set; public class CroupierBoule implements CasinoInterface { private HashMap<String, Integer> lesmisessimples = new HashMap<String, Integer>(); private HashMap<Integer, Integer> lesnumeros = new HashMap<Integer, Integer>(); private int resultat; public CroupierBoule() { super(); public int getnumsorti() { return resultat; public void construitresultat() { // resultat = (int)(math.random() * 9) + 1; resultat = 8; public void addmisesimple(string st, Integer quantite) { lesmisessimples.put(st, quantite); public void addmisenumero(integer numero, Integer quantite){ lesnumeros.put(numero, quantite); public int gainouperte() { // Set misessimplesjouees = lesmisessimples.keyset(); System.out.println("debut de gainouperte() du jeu de la boule"); int gainoupertefinal = 0; int leresultat = getnumsorti(); boolean pasdegain = true; // Calcul des gains et pertes sur les numeros pleins Set<Integer> LesNumerosJoues = lesnumeros.keyset(); for (Integer unnumerojoue : LesNumerosJoues) { Integer quantitesurcenumero = lesnumeros.get(unnumerojoue); pasdegain = true; int numeroetudie = unnumerojoue.intvalue(); if (numeroetudie == leresultat) { System.out.println("un gain sur le numero " + leresultat); gainoupertefinal += 7 * quantitesurcenumero; else if (quantitesurcenumero!= 0) { System.out.println("perte de " + quantitesurcenumero + " sur le numero " + numeroetudie); gainoupertefinal -= quantitesurcenumero; TP sur les Mocks (JUnit) 5/7 Jean-Marc Farinone

// Calcul des gains et pertes sur les mises simples // D'abord les initialisations // Pour la couleur String lacouleursortie = ""; if (leresultat == 1 leresultat == 3 leresultat == 6 leresultat == 8) { lacouleursortie = Constantes.NOIR; else if (leresultat == 2 leresultat == 4 leresultat == 7 leresultat == 9) { lacouleursortie = Constantes.ROUGE; // Pour passe ou manque String passeoumanquesorti = ""; if (leresultat > 5) { passeoumanquesorti = Constantes.PASSE; else if (leresultat < 5) { passeoumanquesorti = Constantes.MANQUE; // fin des initialisations // Calcul proprement dit des gains et pertes sur les mises simples Set<String> leschancessimplesjouees = lesmisessimples.keyset(); for (String unemisechancesimplejouee : leschancessimplesjouees) { Integer quantitesurcettechancesimple = lesmisessimples.get(unemisechancesimplejouee); if (leresultat == 5) { gainoupertefinal -= quantitesurcettechancesimple; System.out.println("Le 5 est sorti donc perte sur " + unemisechancesimplejouee); continue; // D'abord les parites if ((unemisechancesimplejouee.equals(constantes.pair)) && (leresultat % 2 == 0)) { System.out.println("même parité"); if ((unemisechancesimplejouee.equals(constantes.impair)) && (leresultat % 2 == 1)) { System.out.println("même parité"); // ensuite les couleurs if ((unemisechancesimplejouee.equals(constantes.noir)) && (lacouleursortie.equals(constantes.noir))) { System.out.println("même couleur noire"); if ((unemisechancesimplejouee.equals(constantes.rouge)) && (lacouleursortie.equals(constantes.rouge))) { System.out.println("même couleur rouge"); // Enfin passe ou manque if ((unemisechancesimplejouee.equals(constantes.passe)) && (passeoumanquesorti.equals(constantes.passe))) { System.out.println("même passe"); TP sur les Mocks (JUnit) 6/7 Jean-Marc Farinone

if ((unemisechancesimplejouee == Constantes.MANQUE) && (passeoumanquesorti.equals(constantes.manque))) { System.out.println("même manque"); if (pasdegain) { gainoupertefinal -= quantitesurcettechancesimple; System.out.println(" qui amène un gain ou une perte de " + gainoupertefinal); System.out.println("FIN de gainouperte() de la Boule"); return gainoupertefinal; On comprend désormais pourquoi avoir un mock qui donnait immédiatement le résultat en fonction des mises et du numéro sorti était bien pratique et dispense de vérifier que l'algorithme et le code de la méthode gainouperte() soit juste. TP sur les Mocks (JUnit) 7/7 Jean-Marc Farinone