Exercices dirigés Tests Unitaires avec JUnit


Exercice 1

Ecrire un test unitaire StringBufferTest permettant de tester les méthodes charAt, setCharAt et append(String str) de la classe StringBuffer du Java SDK.
(Définir également les méthodes de test testAppendWithNullString et  testCharAtWithInvalidIndexes testant les exceptions susceptibles d'être levées par la méthode charAt.)

Exercice 2

Les fichiers incomplets (et même partiellement erronés!)  MyDate.java et MyDateTest.java sont fournis.
  1. On se propose de tester (et mettre au point) la méthode statique boolean isValidDate(int day, int month, int year).
    Compléter le test unitaire MyDateTest pour couvrir les différentes classes d'équivalences (plus de détails dans ce document).
    CE Valides
    CE Invalides
     1<= jour <=31 ET
     1<= mois <= 12 ET
     année >= 0 (a1)
    jour < 1 (b1)
    jour > 31 (b2)
    mois < 1 (b3)
    mois > 12 (b4)
    année > 2012 (b5)
    année < 1812 (b6)
     mois € {2,4,6,9,11}
     => 1<= jour <=30
    (a2)
    mois  {2,4,6,9,11} ET
    (jour<1 OU jour>30) (b7)
     (mois = 2) ET (année non bissextile)
    => (jour <= 28)
    (a3)
    (mois = 2) ET (année non bissextile) ET (jour> 28) (b8)
    (mois = 2) ET (année bissextile)
    => (jour <= 29)
    (a4)
    (mois = 2) ET (année bissextile) ET (jour> 29) (b9)
  2. Définir la méthode nextDay (ou lendemain) dans la classe MyDate. La mettre au point en la testant avec un nouveau test unitaire MyDateNextDayTest.
(Note : les signatures des méthodes publiques déjà fournies de la classe MyDate ne doivent pas être modifiées.)

Exercice 3

On a besoin de fonctionnalités de manipulation de chaînes de caractères absentes des classes standards String et StringBuffer (package java.lang). On va donc développer en utilisant une approche "test first" la classe MyString et sa classe de tests MyStringTest.
Au contraire de la classe String et par souci d'efficacité la classe MyString sera "mutable" : on l'implémentera donc en réutilisant par composition la classe StringBuffer, (on ne peut en hériter car la classe StringBuffer est déclarée final) :

public class MyString 
{
    // instance variables
    private StringBuffer _sb;

    /**
     * Constructor for objects of class MyString
     */
    public MyString(String s)
    {
        // initialise instance variables
        _sb = new StringBuffer(s);
    }

    // Accesseurs
    public String getString() { /* TODO */ }
    public void setString(String s) { /* TODO */ }

// ... TODO

Voici la liste des fonctionnalités manquantes désirées :
  1. convertir tous les caractères de la chaîne en majuscule : void toUpperCase(),
  2. obtenir le nombre d'occurence d'un caractère donné : int numberOfChar(char c),
  3. obtenir le nombre de voyelles (le Y sera considéré comme consonne) : int numberOfVoyelles(),
  4. obtenir le premier mot de la chaîne : String getFirstWord() ...
Incrémentalement, pour (les accesseurs et) chaque fonctionnalité func<i> :
  1. définir une méthode de test testFunc<i> dans la classe MyStringTest  (ce qui devrait aider à définir l'interface de la méthode func<i> à tester)
  2. implémenter la méthode func<i> dans la classe MyString (de la façon la plus simple possible!)
  3. tester
  4. optimiser éventuellement l'implémentation de func<i> dans la classe MyString
  5. revenir au point 3.
(Définir éventuellement plusieurs méthodes de test dans la classe MyStringTest pour tester une même fonction.)

Liens