IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Tester une classe


Sujet :

Java

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Tester une classe
    Bonjour,

    Je suis entrain de faire des tests unitaires et je ne vois pas trop comment tester ces deux méthode avec le assertEquals:
    - joursFeries
    - construireCalendrier

    Par ailleurs, pouvez-me dire si c'est judicieux de mettre la méthode getJoursOuvrable dans cette classe comme on lui passe un JTable et autre chose ou plutôt dans la vue. Il s'agit du modèle que je vous présente ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    public class CalendrierModele {
    	/**
             * Méthode qui retourne les jours fériés
             * @param annee
             */
    	private void joursFeries(Annee annee){
    		int anneeChoisit = annee.anneeChoisit(annee);
     
    		// On passe l'année choisit au calendar
    	    Calendar calendar = Calendar.getInstance();
    	    calendar.set(Calendar.YEAR, anneeChoisit);
     
            // On constitue la liste des jours fériés
            List<Calendar> joursFeries = new ArrayList<Calendar>();
     
            // On recherche les jours fériés de l'année passée en paramètre
            Calendar jourFerie = Calendar.getInstance();
            jourFerie = (Calendar) calendar.clone();
     
            jourFerie.set(jourFerie.get(Calendar.YEAR), Calendar.NOVEMBER, 1);
            joursFeries.add((Calendar) jourFerie.clone());
     
            jourFerie.set(jourFerie.get(Calendar.YEAR), Calendar.NOVEMBER, 11);
            joursFeries.add((Calendar) jourFerie.clone());
     
            jourFerie.set(jourFerie.get(Calendar.YEAR), Calendar.DECEMBER, 25);
            joursFeries.add((Calendar) jourFerie.clone());
     
            //On ajoute 1 à l'année choisit
            jourFerie.add(Calendar.YEAR, 1);
     
            jourFerie.set(jourFerie.get(Calendar.YEAR), Calendar.JANUARY, 1);
            joursFeries.add((Calendar) jourFerie.clone());
     
            jourFerie.set(jourFerie.get(Calendar.YEAR), Calendar.MAY, 1);
            joursFeries.add((Calendar) jourFerie.clone());
     
            jourFerie.set(jourFerie.get(Calendar.YEAR), Calendar.MAY, 8);
            joursFeries.add((Calendar) jourFerie.clone());
     
            jourFerie.set(jourFerie.get(Calendar.YEAR), Calendar.JULY, 14);
            joursFeries.add((Calendar) jourFerie.clone());
     
            jourFerie.set(jourFerie.get(Calendar.YEAR), Calendar.AUGUST, 15);
            joursFeries.add((Calendar) jourFerie.clone());
        }
     
    	/**
             * Méthode qui permet de construire le calendrier pour une année scolaire
             * @param uneAnnee
             * @return calendar
             */
    	public Calendar construireCalendrier(Annee uneAnnee){
    		int anneeChoisit;
    		int anneeActuelle;
    		int anneeDefinitif;
    		Calendar calendar;
     
    		//Convertion de l'année choisit pour la création du calendrier en entier
    		anneeChoisit = uneAnnee.anneeChoisit(uneAnnee);
     
    		//Récupération de l'année actuelle
            calendar = Calendar.getInstance();
    		anneeActuelle = calendar.get(Calendar.YEAR);
     
    		//Comparaison de l'année actuelle avec l'année choisit
    		//Si l'année actuelle est avant l'année choisit, on ajoute des années à l'année actuelle pour créer le calendrier
    		//Si l'année actuelle est après l'année choisit, on enlève des années à l'année actuelle pour créer le calendrier
    		if(anneeActuelle < anneeChoisit){
    			anneeDefinitif = anneeChoisit - anneeActuelle; 
    			calendar.add(Calendar.YEAR, +anneeDefinitif);
    		}else if(anneeActuelle > anneeChoisit){
    			anneeDefinitif = anneeActuelle - anneeChoisit;
    			calendar.add(Calendar.YEAR, -anneeDefinitif);
    		}else{
    			calendar.add(Calendar.YEAR, 0);
    		}
     
    		// on se positionne sur le mois de septembre    	   
            calendar.set(Calendar.MONTH,Calendar.SEPTEMBER); 
     
            // on se positionne sur la première semaine du mois
            calendar.set(Calendar.WEEK_OF_MONTH, 1); 
     
            // on se positionne sur le premier jour officiel
            calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
     
    		return calendar;
    	}
     
    	/**
             * Méthode qui gère les jours ouvrés
             */
    	public void getJoursOuvrable(JTable table, CalendrierTableModele tableModel, Calendrier calendrier){
    		JTableRender mcr = new JTableRender();
     
    		if(calendrier.getSamediOuvrable() == true){
    			table.getColumnModel().getColumn(5).setCellRenderer(mcr);
    			tableModel.isCellEditable(0, 5);
    		}
     
    		if(calendrier.getDimancheOuvrable() == true){
    			table.getColumnModel().getColumn(6).setCellRenderer(mcr);
    			tableModel.isCellEditable(0, 6);
    		}
     
    		if(calendrier.getFerieOuvrable() == true){
    			joursFeries(calendrier.getUneAnnee());
    			//COMMENT FAIRE POUR GRISER LES CASES DONT LES JOURS SONT FERIES
    		}
    	}
     
    Merci d'avance
    }

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Alors, plusieurs points :
    - tu peux supprimer TOUS les cast de Calendrier pour ajouter dans ta liste (jourFerie = (Calendar) calendar.clone(); ==> jourFerie = calendar.clone()
    - pourquoi abuser à ce point du clonage? Si tu veux absolument utiliser un seul objet Calendar, tu peux utiliser la méthode getTime() qui te renverra un objet Date correspondant. Et du coup, stocker des objets Date plutôt que des objets Calendar
    - la méthode set(int year, int month, int date) est bien, mais tu peux aussi utiliser la méthode set(int field, int value), par exemple : myCalendar.set(Calendar.Month, Calendar.NOVEMBER) puis aller récupérer le 1 et le 11 en faisant myCalendar.set(Calendar.DAY_OF_MONTH, 1) puis myCalendar.set(Calendar.DAY_OF_MONTH, 11) (en faisant un getTime() à stocker dans ta map après chacun) : ça éviter de rappeler la date à chaque fois
    - tu as ton année qui est une "constante" dans ta méthode dans le sens où elle ne change jamais : pourquoi tu ne crée par une variable locale plutôt que de chaque fois appeler jourFerie.get(Calendar.YEAR) ? (ça alourdi énormément pour rien)
    - on peut voir la classe Annee?


    Les tests que tu peux faire : vérifier que tous les jours fériés sont bien dans la liste par exemple. Genre que ta liste renvoie effectivement le 1er novembre...
    Un test unitaire doit tester la finalité de la méthode : quelle est la finalité de chaque méthode?


    Par ailleurs, pouvez-me dire si c'est judicieux de mettre la méthode getJoursOuvrable dans cette classe comme on lui passe un JTable et autre chose ou plutôt dans la vue. Il s'agit du modèle que je vous présente ici.
    En programmation orientée objet, on appelle ça du couplage élevé et une basse cohésion : ta classe dépend du JPaneTable et ne peux donc fonctionner qu'avec alors que rien dans sa nature ne pousse à penser que sa vie dépend d'un JPaneTable (couplage élevé). Pourquoi est-ce que tu délègue à ton objet modèle la fonction de savoir comment il doit s'afficher ? (basse cohésion) Laisse ça à une classe qui aura pour rôle l'affichage de tes éléments de date
    Je ne suis pas mort, j'ai du travail !

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par totot Voir le message
    Bonjour,

    Je suis entrain de faire des tests unitaires et je ne vois pas trop comment tester ces deux méthode avec le assertEquals:
    - joursFeries
    - construireCalendrier
    Pour faie simple:

    joursFeries est privée. Tu ne la teste pas, elle n'a aucun intérêt pour les utilisateurs de ta classe. Elle peut disparaitre du jour au lendemain sans influence sur les autres classes.
    Ta méthode ne fait rien donc difficile de tester quoi que ce soit: elle remplit une List qu'elle jette à la fin de l'appel.
    Comme dit pat eulbobo, il faut voir quelle est la finalité de ta classe. Représenter un Calendrier avec des rendez-vous et des jours fériés? Alors donne lui en les moyens et les méthodes, tu pourra alors faire des test du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CalendrierModele  model = new CalendrierModel();
    List<Calendar> feries = model.getFeries();
    int year = new GregorianCalendar().get(Calendar.YEAR);
    Calendar premierJanvier = new GregorianCalendar(year,CALENDAR.JANUARY,1,0,0,0);
    assertEquals(22,feries.size()); // 11 jours fériés par an * 2 ans
    assertTrue(feries.contains(premierJanvier));
    for (Calendar c: feries){
       assertEquals(0,c.get(CALENDAR.HOURS));
       assertEquals(0,c.get(CALENDAR.MINUTES));
       assertEquals(0,c.get(CALENDAR.SECONDS));
    }
     
    Calendar today = new GregorianCalendar();
    model.ajoutEvenement(today,"yeah congé","youpie je part en vacances");
    Evenement e = model.getEvenement(today);
    assertEquals("yeah congé",e.getTitre());
    assertEquals("youpie je part en vacances",e.getDescription());
    Concernant ta deuxième méthode, même réflexion, on ne vois pas ce qu'elle est censée faire exactement et ce qu'elle modifie / retourne. Donne lui d'abord un role clair avec des input et output précis, et tu pourra tester ça. Le fait que tu n'arrive pas à tester est un indicateur que ta méthode ne se comporte pas comme elle devrait et que ton design sent un peu beaucoup le sapin.

    Concernant ta troisième méthode getJoursOuvrable, elle n'a rien à faire là, simplement. Crée un classe étendant TableCellRenderer qui fait le boulot de dessiner les couleurs des cellules, plutot que d'essaer de chipoter à attribuer des renderer différent à chaque cellule. De toutes façons, elle doit être dans une partie consacrée à la vue pas au modèle.

    Autre remarque, cet appel c'est n'importe quoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    anneeChoisit = uneAnnee.anneeChoisit(uneAnnee);
    tu passe une objet en paramètre d'une méthode appelée sur ce même objet. Le paramètre est inutile de part l'appel de la méthode, on sait déjà sur quel objet on travaille. Faut revoir ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    anneeChoisie = uneAnnee.getAnneeChoisie();// on corrige le français et on respecte les conventions java au passage....

Discussions similaires

  1. Réponses: 9
    Dernier message: 13/03/2015, 18h19
  2. Tester la création d'une classe
    Par Grumphette dans le forum Langage
    Réponses: 9
    Dernier message: 09/07/2008, 13h13
  3. Tester si une classe est dans le classpath
    Par julien.63 dans le forum Langage
    Réponses: 6
    Dernier message: 09/01/2008, 12h37
  4. Réponses: 23
    Dernier message: 11/11/2007, 20h01
  5. Astuces pour tester propiétés d'une classe
    Par Masmeta dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/12/2006, 09h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo