• 15 heures
  • Facile

Ce cours est visible gratuitement en ligne.

Ce cours est en vidéo.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

J'ai tout compris !

Mis à jour le 28/01/2019

Ajoutez de nouvelles fonctionnalités

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Le client pour lequel on développe cette application a des besoins assez précis. Pour pouvoir proposer à ses clients un prix de 9€ quel que soit le menu, il impose certaines règles.

Pour récupérer une version propre du projet prêt pour ce chapitre vous pouvez importer le projet git suivant : MyMenu - Step 4

Le cahier des charges

Le poulet est l'aliment qui coûte le moins cher, il propose donc accompagnement au choix :

  • des légumes frais

  • des frites

  • ou du riz

Et une boisson :

  • eau plate

  • eau gazeuse

  • ou soda

La viande de boeuf et sa préparation reviennent un peu plus cher au restaurant. Les accompagnements proposés sont les mêmes, mais cette fois-ci pas de boisson inclue dans le menu.

Enfin le menu végétarien est toujours composé de légumes frais, on peut choisir d'avoir en plus un peu de riz. Une boisson est aussi proposée avec ce menu.

De la même manière que la première fois, nous allons poser une question à l'utilisateur et afficher son choix.

Les accompagnements

Vous n'avez pas encore les compétences pour coder cela proprement. En tant que chef de projet j'en suis conscient. Pour l'instant, je vais vous demander de coder différentes fonctions à partir des tests suivants. Ajoutez-les aux autres dans  OrderTest .

@Test
public void Given_VegetablesAndAllSides_When_DisplaySideSelected_Then_DisplayVegetablesSentence() {
    order.displaySelectedSide(1, true);
    String output = outContent.toString().replace("\r\n", "\n");
    assertEquals("Vous avez choisi comme accompagnement : légumes frais\n", output);
}
@Test
public void Given_FriesAndAllSides_When_DisplaySideSelected_Then_DisplayFriesSentence() {
    order.displaySelectedSide(2, true);
    String output = outContent.toString().replace("\r\n", "\n");
    assertEquals("Vous avez choisi comme accompagnement : frites\n", output);
}
@Test
public void Given_RiceAndAllSides_When_DisplaySideSelected_Then_DisplayRiceSentence() {
    order.displaySelectedSide(3, true);
    String output = outContent.toString().replace("\r\n", "\n");
    assertEquals("Vous avez choisi comme accompagnement : riz\n", output);
}
@Test
public void Given_BadValueAndAllSides_When_DisplaySideSelected_Then_DisplayErrorSentence() {
    order.displaySelectedSide(5, true);
    String output = outContent.toString().replace("\r\n", "\n");
    assertEquals("Vous n'avez pas choisi d'accompagnement parmi les choix proposés\n", output);
}
@Test
public void Given_RiceAndNotAllSides_When_DisplaySideSelected_Then_DisplayRiceSentence() {
    order.displaySelectedSide(1, false);
    String output = outContent.toString().replace("\r\n", "\n");
    assertEquals("Vous avez choisi comme accompagnement : riz\n", output);
}
@Test
public void Given_NoRiceAndNotAllSides_When_DisplaySideSelected_Then_DisplayNoRiceSentence() {
    order.displaySelectedSide(2, false);
    String output = outContent.toString().replace("\r\n", "\n");
    assertEquals("Vous avez choisi comme accompagnement : pas de riz\n", output);
}
@Test
public void Given_BadValueAndNotAllSides_When_DisplaySideSelected_Then_DisplayErrorSentence() {
    order.displaySelectedSide(5, false);
    String output = outContent.toString().replace("\r\n", "\n");
    assertEquals("Vous n'avez pas choisi d'accompagnement parmi les choix proposés\n", output);
}

Prenons le temps d'observer ces tests pour comprendre ce que j'attends de vous ici. Commençons par le premier :

Given_VegetablesAndAllSides_When_DisplaySideSelected_Then_DisplayVegetablesSentence

En respectant le format Given/When/Then on a :

  • Given : VegetablesAndAllSides → la valeur correspondant aux légumes frais et tous les accompagnements proposés

  • When : DisplaySideSelected → quand on demande l'accompagnement choisi

  • ThenDisplayVegetablesSentence → on affiche la phrase concernant les légumes frais

Le code est simple à comprendre, on a juste 3 lignes :

order.displaySelectedSide(1, true);

On utilise une méthode nommée  displaySelectedSide  en lui passant 2 paramètres :

  • 1  signifiant légumes frais ;

  • true  signifiant tous les accompagnements (légumes frais, frites et riz).

String output = outContent.toString().replace("\r\n", "\n");

Cette ligne permet de récupérer ce qui est affiché sur la sortie standard.

Dans le monde de Windows, un retour à la ligne est affiché avec le caractère spéciale  \r\n  . Dans le monde de Linux/Mac c'est simplement avec  \n  .

La partie   .replace("\r\n", "\n")  permet de transformer les retours à la ligne Linux et Windows sous le même format. C'est plus simple pour comparer le résultat.

assertEquals("Vous avez choisi comme accompagnement : légumes frais\n", output);

On utilise une fonction nommée  assertEquals  pour vérifier que le texte affiché par votre méthode vaille bien  "Vous avez choisi les légumes frais\n" . Si c'est vrai le test est vert sinon il est rouge !

D'où sortent  assertEquals  et  outContent  ? 

assertEquals  est une méthode que l'on a importée depuis une autre classe, regardez en haut de votre fichier :  import static org.junit.Assert.assertEquals;

outContent  est une variable qui est accessible partout dans notre classe, elle est créée au début de la classe  OrderTest  et sert à récupérer la sortie terminal. 

Regardons le format Given/When/Then de 2 autres fonctions :

Given_BadValueAndAllSides_When_DisplaySideSelected_Then_DisplayErrorSentence

  • Given : BadValueAndAllSides → une mauvaise valeur d'accompagnement.

  • When : DisplaySideSelected → quand on demande l'accompagnement choisi.

  • Then : DisplayErrorSentence → on affiche une phrase d'erreur.

Given_NoRiceAndNotAllSides_When_DisplaySideSelected_Then_DisplayNoRiceSentence

  • Given : NoRiceAndNotAllSides → Seulement le riz proposé en accompagnement. Le choix pas de riz. 

  • When : DisplaySideSelected → quand on demande l'accompagnement choisi.

  • Then : DisplayNoRiceSentence → on affiche la phrase confirmant le choix "pas de riz".

Ajoutez les tests dans la classe  OrderTest . Une erreur apparaît et vous indique que la fonction  displaySelectedSide  n'existe pas. Faites alt + Entrée en vous plaçant sur le nom de la méthode puis choisissez Create method 'displaySelectedSide'.

Génération méthode
Génération méthode

Automatiquement IntelliJ ajoute le code suivant dans Order :

public void displaySelectedSide(int i, boolean b) {
}

Modifiez le nom des paramètres et ajoutez la javadoc pour que ce soit plus lisible :

/**
 * Display a selected side depending on all sides enable or not.
 * All sides = vegetables, frites and rice
 * No all sides = rice or not
 * @param nbSide The selected Side
 * @param allSidesEnable  enable display for all side or not
 */
public void displaySelectedSide(int nbSide, boolean allSidesEnable) {
}

 Il faut maintenant ajouter le contenu dans  displaySelectedSide  pour valider les tests !

 Si vous n'avez pas réussi tout seul, voici la solution :

/**
 * Display a selected side depending on all sides enable or not.
 * All sides = vegetables, frites and rice
 * No all sides = rice or not
 * @param nbSide The selected Side
 * @param allSidesEnable  enable display for all side or not
 */
public void displaySelectedSide(int nbSide, boolean allSidesEnable) {
    if (allSidesEnable) {
        switch (nbSide) {
            case 1:
                System.out.println("Vous avez choisi comme accompagnement : légumes frais");
                break;
            case 2:
                System.out.println("Vous avez choisi comme accompagnement : frites");
                break;
            case 3:
                System.out.println("Vous avez choisi comme accompagnement : riz");
                break;
            default:
                System.out.println("Vous n'avez pas choisi d'accompagnement parmi les choix proposés");
                break;
        }
    } else {
        switch (nbSide) {
            case 1:
                System.out.println("Vous avez choisi comme accompagnement : riz");
                break;
            case 2:
                System.out.println("Vous avez choisi comme accompagnement : pas de riz");
                break;
            default:
                System.out.println("Vous n'avez pas choisi d'accompagnement parmi les choix proposés");
                break;
        }
    }
}

Les boissons

La partie boisson est plus simple, je vous laisse rédiger les tests puis la fonction  displaySelectedDrink  par la suite. Prenez dès maintenant l'habitude de rédiger les tests et ensuite d'utiliser IntelliJ pour générer la méthode.

Comme d'habitude, voici la correction :

@Test
public void Given_Water_When_DisplayDrinkSelected_Then_DisplayWaterSentence() {
    order.displaySelectedDrink(1);
    assertEquals("Vous avez choisi comme boisson : eau plate\n", outContent.toString().replace("\r\n", "\n"));
}
@Test
public void Given_SparklingWater_When_DisplayDrinkSelected_Then_DisplaySparklingWaterSentence() {
    order.displaySelectedDrink(2);
    assertEquals("Vous avez choisi comme boisson : eau gazeuse\n", outContent.toString().replace("\r\n", "\n"));
}
@Test
public void Given_Soda_When_DisplayDrinkSelected_Then_DisplaySodaSentence() {
    order.displaySelectedDrink(3);
    assertEquals("Vous avez choisi comme boisson : soda\n", outContent.toString().replace("\r\n", "\n"));
}
@Test
public void Given_BadValue_When_DisplayDrinkSelected_Then_DisplayErrorSentence() {
    order.displaySelectedDrink(5);
    assertEquals("Vous n'avez pas choisi de boisson parmi les choix proposés\n", outContent.toString().replace("\r\n", "\n"));
}
/**
 * Display a selected drink.
 * @param nbDrink The selected drink.
 */
public void displaySelectedDrink(int nbDrink) {
    switch (nbDrink) {
        case 1:
            System.out.println("Vous avez choisi comme boisson : eau plate");
            break;
        case 2:
            System.out.println("Vous avez choisi comme boisson : eau gazeuse");
            break;
        case 3:
            System.out.println("Vous avez choisi comme boisson : soda");
            break;
        default:
            System.out.println("Vous n'avez pas choisi de boisson parmi les choix proposés");
            break;
    }
}

Et pour finir ?

Il reste maintenant à ajouter les fonctions servant à afficher les questions pour les accompagnements et les boissons :

/**
 * Display all available sides depending on all sides enable or not.
 * All sides = vegetables, frites and rice
 * No all sides = rice or not
 * @param allSideEnable enable display for all side or not
 */
public void displayAvailableSide(boolean allSideEnable) {
    System.out.println("Choix accompagnement");
    if (allSideEnable) {
        System.out.println("1 - légumes frais");
        System.out.println("2 - frites");
        System.out.println("3 - riz");
    } else {
        System.out.println("1 - riz");
        System.out.println("2 - pas de riz");
    }
    System.out.println("Que souhaitez-vous comme accompagnement ?");
}
 
 /**
 * Display all available drinks in the restaurant
 */   
public void displayAvailableDrink() {
    System.out.println("Choix boisson");
    System.out.println("1 - eau plate");
    System.out.println("2 - eau gazeuse");
    System.out.println("3 - soda");
    System.out.println("Que souhaitez-vous comme boisson ?");
}

Commencez par supprimer le test  Given_ChikenInStandardInput_When_MenuIsRun_Then_DisplayCorrectProcess  et remplacez-le par ces 3 tests :

@Test
public void Given_ChikenWithFriesAndWaterInStandardInput_When_MenuIsRun_Then_DisplayCorrectProcess() {
    System.setIn(new ByteArrayInputStream("1\n2\n3\n".getBytes()));
    order = new Order();
    order.runMenu();
    String[] output = outContent.toString().replace("\r\n", "\n").split("\n");
    assertEquals("Vous avez choisi comme menu : poulet", output[5]);
    assertEquals("Vous avez choisi comme accompagnement : frites", output[11]);
    assertEquals("Vous avez choisi comme boisson : soda", output[17]);
}
@Test
public void Given_BeefWithVegetableInStandardInput_When_MenuIsRun_Then_DisplayCorrectProcess() {
    System.setIn(new ByteArrayInputStream("2\n1\n".getBytes()));
    order = new Order();
    order.runMenu();
    String[] output = outContent.toString().replace("\r\n", "\n").split("\n");
    assertEquals("Vous avez choisi comme menu : boeuf", output[5]);
    assertEquals("Vous avez choisi comme accompagnement : légumes frais", output[11]);
}
@Test
public void Given_VegetarianWithNoRiceAndSparklingWaterInStandardInput_When_MenuIsRun_Then_DisplayCorrectProcess() {
    System.setIn(new ByteArrayInputStream("3\n2\n2\n".getBytes()));
    order = new Order();
    order.runMenu();
    String[] output = outContent.toString().replace("\r\n", "\n").split("\n");
    assertEquals("Vous avez choisi comme menu : végétarien", output[5]);
    assertEquals("Vous avez choisi comme accompagnement : pas de riz", output[10]);
    assertEquals("Vous avez choisi comme boisson : eau gazeuse", output[16]);
}

 Et maintenant il faut utiliser tout ça dans  runMenu  pour avoir notre menu complet :

/**
 * Run asking process for a menu.
 */
public void runMenu() {
    this.displayAvailableMenu();
    Scanner sc = new Scanner(System.in);
    int nbMenu = sc.nextInt();
    this.displaySelectedMenu(nbMenu);
    switch (nbMenu) {
        case 1:
            displayAvailableSide(true);
            int nbSide = sc.nextInt();
            displaySelectedSide(nbSide, true);
            displayAvailableDrink();
            int nbDrink = sc.nextInt();
            displaySelectedDrink(nbDrink);
            break;
        case 2:
            displayAvailableSide(true);
            nbSide = sc.nextInt();
            displaySelectedSide(nbSide, true);
            break;
        case 3:
            displayAvailableSide(false);
            nbSide = sc.nextInt();
            displaySelectedSide(nbSide, false);
            displayAvailableDrink();
            nbDrink = sc.nextInt();
            displaySelectedDrink(nbDrink);
            break;
    }
}

  Voici notre Diagramme de classes UML actualisé : 

UML Order avec side et drink
UML Order avec side et drink
Exemple de certificat de réussite
Exemple de certificat de réussite