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

avec Java Discussion :

[JUnit / assert] assertEquals bloque quand méthode equals() renvoie faux


Sujet :

avec Java

  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut [JUnit / assert] assertEquals bloque quand méthode equals() renvoie faux
    Bonjour,

    je teste une classe Matrice via Junit.
    Cette classe à un attribut int[][] (la matrice) et tout un tas de méthode pour interagir avec ce tableau 2D.

    Pour pouvoir tester cette classe, j'ai surchargé la methode equals de la façon suivante :
    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
     
    	/**
             * equals : indique si un autre objet TabInt est egal a celui-la
             * @param tab : Objet avec lequel on fait la comparaison
             * @return true si l'objet est le meme que celui passe en argument
             */
    	public boolean equals(Object mtx)
    	{
    		boolean egal = true;
     
    		if(this.getClass().getName() != mtx.getClass().getName())
    			egal = false;
    		else if((this.getNbCol() != ((Matrice) mtx).getNbCol()) || (this.getNbLigne() != ((Matrice) mtx).getNbLigne()))
    			egal = false;
    		else
    		{
    			for(int i = 0; i<this.getNbLigne() && egal; i++)
    			{
    				for(int j = 0; j<this.getNbCol(); j++)
    				{
    					if(this.getPixel(i, j) != ((Matrice) mtx).getPixel(i, j))
    					{
    						egal = false;
    						break;
    					}
    				}
    			}
    		}
     
    		System.out.println(egal);
    		return egal;
    	}
    ça marche bien quand les matrices sont effectivement égale, mais quand elles ne le sont pas, la méthode imprime bien false, mais le teste JUnit reste bloqué, il ne dépasse jamais le AssertEquals.

    Je comprends pas ce qu'il se passe. Je pense que ça vient de ma méthode equals vu qu'un assertEquals(2,4) (par exemple) ne bloque pas mon test...
    Toutes les pistes de recherches sont les bienvenues.
    Merci d'avance

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par zaboug Voir le message
    ça marche bien quand les matrices sont effectivement égale, mais quand elles ne le sont pas, la méthode imprime bien false, mais le teste JUnit reste bloqué, il ne dépasse jamais le AssertEquals.
    bah pour moi ça me semble normal, lorsqu'un test ne passe pas on ne fait pas les suivants (provoque un "fail" junit donc une AssertionError)

    Non?

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    je me suis mal exprimée : je m'attend bien à ce que le test me dise qu'il a échoué. Quand je dis qu'il reste bloqué, c'est qu'il ne se termine jamais. Comme s'il y avait une boucle infinie dedans quoi... et ça, ça ne me semble pas normal

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    euh ouaich... bin euh difficile à dire... un ptit bout de code qui reproduit le problème pour illustrer ça? parce que j'ai pas trop d'idées là tout de suite....

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    J'utilise JUnit 3.8 pour les tests Unitaires.

    voici la classe Matrice :

    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
     
    /**
     * @author Mathilde Pellerin
     * @date 20 avr. 2010
     */
    package fr.statlife.LAM;
     
    import java.awt.image.BufferedImage;
    import java.util.Arrays;
     
     
    /**
     * @author Mathilde Pellerin
     *
     */
    public class Matrice
    {
    	private int [][] mtx;
    	private int nbLigne;
    	private int nbCol;
     
    	/**
             * Constructeur matrice vide
             * @param nbLigne : Nombre de lignes
             * @param nbCol : Nombre de Colonnes
             */
    	public Matrice(int nbLigne, int nbCol)
    	{
    		this.mtx = new int[nbLigne][nbCol];
    		this.nbLigne = nbLigne;
    		this.nbCol = nbCol;
    	}
     
    	/**
             * Constructeur d'une matrice a partir d'un tableau d'entiers a 2 dimensions
             * @param tableau d'entiers 2D
             */
    	public Matrice(int[][] tableau)
    	{
    		//Recuperation des dimensions de la matrice
    		this.nbLigne = tableau.length;
    		this.nbCol = tableau[0].length;
     
    		this.mtx = new int[nbLigne][nbCol];
     
    		//Copie de la matrice
    		for(int i=0; i<this.nbLigne; i++)
    		{
    			for(int j=0; j<this.nbCol; j++)
    				this.mtx[i][j] = tableau[i][j];
    		}
    	}
     
    	/**
             * equals : indique si un autre objet TabInt est egal a celui-la
             * @param tab : Objet avec lequel on fait la comparaison
             * @return true si l'objet est le meme que celui passe en argument
             */
    	public boolean equals(Object mtx)
    	{
    		boolean egal = true;
     
    		//Les objets ne sont pas egaux si :
    		// -> les deux classes ne sont pas du meme type
    		if(this.getClass().getName() != mtx.getClass().getName())
    			egal = false;
    		// -> les deux matrices ne sont pas de meme dimensions
    		else if((this.getNbCol() != ((Matrice) mtx).getNbCol()) || (this.getNbLigne() != ((Matrice) mtx).getNbLigne()))
    			egal = false;
    		// -> pour des memes coordonnees les valeurs des deux matrices ne sont pas identiques
    		else
    		{
    			for(int i = 0; i<this.getNbLigne() && egal; i++)
    			{
    				for(int j = 0; j<this.getNbCol(); j++)
    				{
    					if(this.getPixel(i, j) != ((Matrice) mtx).getPixel(i, j))
    					{
    						egal = false;
    						break;
    					}
    				}
    			}
    		}
    		System.out.println(egal);
    		return egal;
    	}
    }
    ET voici 3 exemples de tests :
    • testNonBloquant1 : les deux matrices sont différentes, le test échoue mais ne se bloque pas
    • testNonBloquant2 : les deux matrices sont construite par la méthode constructionMatrice(), elles sont donc identiques (et relativement grande), le test réussie et ne se bloque pas
    • testBloquant : les deux matrices sont différentes, l'une est construite par la méthode constructionMatrice() et est donc relativement grande, le test se bloque.

    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
     
    /**
     * @author Mathilde Pellerin
     * @date 29 avr. 2010
     */
    package fr.statlife.LAM.test;
     
    import fr.statlife.LAM.Matrice;
    import fr.statlife.LAM.TabInt;
    import junit.framework.TestCase;
     
    /**
     * @author Mathilde Pellerin
     *
     */
    public class MatriceTest extends TestCase
    {
     
    	private Matrice mtx;
     
    	protected void setUp() throws Exception 
    	{
    		super.setUp();
    		int[][] tab2D = {{3,2,1},{2,9,4},{6,1,3}};
    		this.mtx = new Matrice(tab2D);
    	}
     
    	protected void tearDown() throws Exception
    	{
    		super.tearDown();
    		mtx = null;
    	}
     
    	public void testNonBloquant1()
    	{
    		int[][] tab2D = {{1,2,3},{2,4,9},{1,3,6}};
    		Matrice mtxDifferente = new Matrice(tab2D);
     
    		assertEquals(mtxDifferente, mtx);
    	}
     
    	public void testNonBloquant2()
    	{
    		Matrice mtxDiff = constructionMatrice();
    		assertEquals(mtxDiff, mtxDiff);
    	}
     
    	public void testBloquant()
    	{
    		Matrice mtxDiff = constructionMatrice();
    		assertEquals(mtxDiff, mtx);
    	}
     
    	private Matrice constructionMatrice()
    	{
    		int [][]tab2D = new int[600][640];
    		for(int i = 0; i<600; i++)
    		{
    			int val = 0;
    			int nbVal = 0;
     
    			for(int j = 0; j<640; j++)
    			{
    				//si la valeur est paire
    				//on en met 3 a la suite
    				if(val%2 == 0)
    				{
    					if(nbVal < 3)
    					{
    						nbVal ++;
    					}
    					else
    					{
    						val++;
    						nbVal = 1;
    					}
    					tab2D[i][j] = val;
    				}
    				else
    				{
    					//si la valeur est impaire
    					//on en met 2 a la suite
    					if(nbVal < 2)
    					{
    						nbVal ++;
    					}
    					else
    					{
    						val++;
    						nbVal = 1;
    					}
    					tab2D[i][j] = val;
    				}
     
    			}
    		}
    		Matrice mtxReduite = new Matrice(tab2D);
     
    		return mtxReduite;
    	}
     
    }
    Pour savoir si la méthode equals(), de Matrice, j'imprime la valeur de retour (le booléen egal) juste avant le return. Dans tous les cas, la valeur s'imprime et est correcte (false, true, false).

    ça me laisse perplexe tout ça

  6. #6
    Membre actif Avatar de MaitreKaio
    Profil pro
    Freelance Java / Web / Mobile
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance Java / Web / Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 240
    Points
    240
    Par défaut
    J'ai testé tes classes en faisant un copier / coller avec ce que tu as fourni, en environnement Netbeans et avec JUnit 3.x.
    Je n'ai pas eu de blocage, les tests ont donné les résultats prévus.

    Question subsidiaire: y-a-t-il une raison particulière d'implémenter toi-même une classe Matrice (et peut-être d'autres) alors que de nombreuses librairies existent ?
    J'ai des questions à toutes vos réponses (Woody Allen)
    Mon entreprise: http://qi2-software.fr
    Mon blog Java: http://torrefacteurjava.fr
    Mon blog Pas Java: http://bloq.qi2-software.fr

  7. #7
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par MaitreKaio Voir le message
    J'ai testé tes classes en faisant un copier / coller avec ce que tu as fourni, en environnement Netbeans et avec JUnit 3.x.
    Je n'ai pas eu de blocage, les tests ont donné les résultats prévus.
    ça voudrait dire que le problème vient de mon environnement?
    J'utilise un MacBook avec Mac OS 10.6.3
    Eclipse Galileo
    Java 1.6
    et JUnit 3.8
    il n'est pas impossible que ça coince avec Eclipse : j'ai posté ici un problème sous Eclipse sur la migration de tests JUnit 3.8 vers 4.5...

    Citation Envoyé par MaitreKaio Voir le message
    Question subsidiaire: y-a-t-il une raison particulière d'implémenter toi-même une classe Matrice (et peut-être d'autres) alors que de nombreuses librairies existent ?
    euh pas vraiment : j'ai commencé à développer avec Java sur ce projet. J'avais cherché vite fait (mal fait?...) s'il existait une classe Matrice, mais je n'avais rien trouvé qui me convenait. Alors je l'ai implémenté moi-même, ce qui m'a aussi permis de me familiariser avec Java.

Discussions similaires

  1. Méthode Equals renvoie false ?
    Par scheme dans le forum C#
    Réponses: 13
    Dernier message: 15/11/2010, 09h51
  2. Réponses: 0
    Dernier message: 26/11/2007, 15h47
  3. La méthode equals() de la classe String
    Par Nayila dans le forum Langage
    Réponses: 5
    Dernier message: 31/10/2007, 13h09
  4. Réponses: 12
    Dernier message: 23/03/2006, 14h13
  5. Réponses: 2
    Dernier message: 23/03/2004, 12h23

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