IPRO - TP2
Exceptions et Tests
Guillaume Bouyer
ENSIIE

#1. Application du cours sur des cas simples

#1.1. Exceptions

Faites un nouveau projet Exceptions

#1.1.1. Exercice 1 : Division par zéro

Recopiez le programme suivant

class DivisionByZero{
    public static void main(String[] args){
        int i = 10/args.length;
        System.out.println("i = " + i);
    }
}

#1.1.2. Exercice 2 : Problème de format et Dépassement de tableau

La methode parseInt de la classe Integer convertit une String en entier et est spécifiée ainsi :

public static int parseInt(String s) throws NumberFormatException

#1.2. Tests unitaires avec JUnit 4

#1.2.1. Fonctionnement de JUnit

Principe

JUnit est un framework open source pour le développement et l‘exécution de tests unitaires automatisables d'application Java. Le principal intérêt est de s'assurer que le code répond toujours aux spécifications prévues même après d’éventuelles modifications (“non régression”).

En général, pour chaque classe MaClasse d'une application va correspondre une classe de test MaClasseTest et pour chaque méthode maMethode() de MaClasse qu‘on souhaitera tester on écrira une ou plusieurs méthodes de test. Cela permet d’éviter de créer un main() par classe et de le lancer manuellement.

Création des tests

Le code des classes et méthodes de test est semblable à celui des classes et méthodes classiques. Une méthode de test exécute classiquement les tâches suivantes :

Quelques exemples d'assertions sont :

Lorsqu'un test échoue, un rapport est envoyé (sous la forme d'une exception) qui aidera à découvrir et corriger le(s) bug(s) d'implémentation

Pour connaître tous les tests disponibles, se reporter à la javadoc de la classe Asserthttp://junit.sourceforge.net/javadoc.

La classe de test peut également contenir des méthodes particulières (cf. junit.framework.TestCase), par ex. :

Rq : Eclipse permet de créer le squelette des classes de test : clic droit sur la classe à tester -> New -> JUnit Test Case

Lancement des tests

Dans Eclipse, il faut que la bibliothèque JUnit soit ajoutée au projet :

Pour lancer le test à partir d'Eclipse :

Un nouvel onglet JUnit s'ouvre alors, contenant le rapport d'erreur. 3 cas sont possibles pour chaque méthode de test :

#1.2.2. Exercice

Soit la classe IntegerOp destinée à contenir et faire des opérations sur un nombre entier.

public class IntegerOp {
  private int e;
  private int two = 3; 
  
  public IntegerOp(int n){
    e = n;
  }
  
  public void twice(){
    e *= (2 + 2 - 2 + 1);
  }
  
  public void half(){
    e /= two;
  }
  
  public int getE(){
    return e;
  }
}

On souhaite vérifier que le constructeur et les méthodes fonctionnent comme on le souhaite.

#2. Application à l'inventaire (cf. TP1)

Reprenez le projet Inventory

#2.1. Tests unitaires Devices

#2.2. Exceptions


#3. Documentation pour le TP

#3.1. Lecture des entrées clavier dans la console

#3.1.1. Méthode 1 : BufferedReader

Principe : System.in est de type InputStream, il faut le convertir via BufferedReader et InputStreamReader)

  InputStream in = System.in;
  InputStreamReader isr = new InputStreamReader(in, Charset.forName("UTF-8"));
  BufferedReader reader = new BufferedReader(isr);
  String line = reader.readLine(); // exception à gérer ici
  System.out.println(line);
  reader.close();

Rq : il n'est pas nécessaire de passer par des variables intermédiaires

#3.1.2. Méthode 2 : Scanner

Principe : un objet construit à partir de System.in qui possède des méthodes de récupération spécifiques par type de données

   Scanner sc=new Scanner(System.in);  
   System.out.println("Enter your nb");  
   int nb = sc.nextInt();  
   System.out.println("Enter your name");  
   String name = sc.next();  
   System.out.println("Enter your fee");  
   double fee = sc.nextDouble();  
   System.out.println("Nb:"+nb+" name:"+name+" fee:"+fee);  
   sc.close();