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

Tests et Performance Java Discussion :

Pointer null sur objet testé


Sujet :

Tests et Performance Java

  1. #1
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut Pointer null sur objet testé
    Bonjour,

    Voici le test suivant qui fonctionne :
    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
     
    package user;
     
    import junit.framework.TestCase;
     
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
     
    public class UtilisateurTest extends TestCase
    {
     
        @Test public void testUtilisateur()
        {    
            Utilisateur user = new Utilisateur(1, "toto");
            assertEquals(user.getId().intValue() == 1, true);
        }
     
    }
    Voici le même test en utilisant @Before et @After :
    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
     
    package user;
     
    import junit.framework.TestCase;
     
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
     
    public class UtilisateurTest extends TestCase
    {
        public Utilisateur user;
     
        @BeforeClass public void runBeforeEachTest()
        {
            user = new Utilisateur(1, "toto");
        }
     
        @Test public void testUtilisateur()
        {    
            assertEquals(user.getId().intValue() == 1, true);
        }
     
        @AfterClass public void runAfterEachTest()
        {
            user = null;
        }
     
        /*public static junit.framework.Test suite()
        {
            return new JUnit4TestAdapter(UtilisateurTest.class);
        }
        */
    }
    Et bien l'exécution de celui-ci soulève l'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.lang.NullPointerException
        at user.UtilisateurTest.testUtilisateur(UtilisateurTest.java:20)
    ... comme si @BeforeClass et @AfterClass n'étaient pas exécutés.

    Nota : @Before et @After génère le même soucis.

    Pourquoi ?

    Merci.
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  2. #2
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Pour information, voici le main de test :

    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
     
    package user;
     
    import junit.framework.Test;
    import junit.framework.TestSuite;
     
    public class AllTests
    {
        public static Test suite()
        {
            TestSuite suite = new TestSuite("Test for user");
            //$JUnit-BEGIN$
            suite.addTestSuite(UtilisateurTest.class);
            //$JUnit-END$
            return suite;
        }
     
    }
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  3. #3
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    En fait les méthode @Before et @After ne sont pas appelées automatiquement.

    Pourquoi ?
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  4. #4
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Parce qu'avant chaque methode et après chaque méthode il faut implémenter les methodes spécifiques et que chaque object entre tes 2 methodes n'est pas "sauvagarder".


    Donc dans ton cas il fait bien le before, mais ensuite il réinitialise tout, fait ton test => donc ca plante vu qu'il a tout réinitiliser :


    Donc ton before doit implementer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    protected void setUp() throws Exception {
       //la tu met le code qui est dans ton before
    }
    Et ton after :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    protected void tearDown() throws Exception {
       //la tu met le code qui est dans ton after
    }
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

  5. #5
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Merci maxf1, cela faisait longtemps que tu ne m'avais pas écrit (GAG ).

    Voici donc une classe de test qui fonctionne :
    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
    package user;
    
    import junit.framework.TestCase;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class UtilisateurTest extends TestCase
    {
        public Utilisateur user;
        
        @Before public void runBeforeEachTest()
        {
            
        }
    
        @Test public void testUtilisateur()
        {    
            System.out.println("TEST");
            assertEquals(user.getId().intValue() == 1, true);
        }
        
        @After public void runAfterEachTest()
        {
           
        }
        
        protected void setUp() throws Exception {
            System.out.println("BEFORE");
            user = new Utilisateur(2, "toto");
        }
        
        protected void tearDown() throws Exception {
            System.out.println("AFTER");
            user = null;
        }
        
    }
    ... mais à quoi servent donc les 2 méthodes vident (en gras) ?

    A+
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  6. #6
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Pour faire une reponse simple : A RIEN.

    Ce sont des methodes qui vont etre executer comme celle la :
    testUtilisateur.


    EN gros il va passer dans l'ordre dans :

    - setUp, puis runBeforeEachTest, puis tearDown
    - setUp, puis testUtilisateur, puis tearDown
    - setUp, puis runAfterEachTest, puis tearDown

    J'espere que tu a compris. C'est toi qui a inventé les méthodes en gras ou tu as vu ca sur un tuto?
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

  7. #7
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Bonjour maxf1,

    Pour te répondre, j'ai suivi le tutorial suivant : http://www.instrumentalservices.com/...d=45&Itemid=52

    En fait, les 2 méthodes en gras ne sont jamais exécutées contrairement à ce qui est expliqué dans le tutorial.

    A+
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  8. #8
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Humm ok je ne connaissait pas cette syntaxe c'est pour ca que je la trouvé bizarre. Utilises-tu bien le JUnit 4.0? Car il me semble que ce doit etre une amélioration dans 4.0 de mettre @Before devant la méthode que tu veux appeler avant (afin de pouvoir nommer la methode comme tu le souhaites à la place de SetUp).

    Et Idem pour after.


    Edit de plus il me semble que tu n'es pas obligé et c'est surement ca qui fou la m..d. c'est que ta classe extends TestCase hors sur le tuto la classe n'étend pas TestCase.


    Si t'y arrives avec tes méthodes fait nous signes ca peut-etre pas mal. Perso j'utilise toujours 3.8 donc je ne connaissais pas les nouveautés de 4.0 mais grace a toi j'en ai vu un peu la couleur.
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

  9. #9
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    J'utilise bien JUnit 4.3.

    Tu as compris la même chose que moi sur le tutorial, mais le soucis c'est qu'à l'exécution ces 2 méthodes ne sont pas executées.

    Et je cherche donc où se trouve l'astuce manquante.

    A+
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  10. #10
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Tu as essaye en n'étendant pas ta classe de TestCase car c'est surement ca le souci!! Etant donnée que ca étant TestCase il veut les methodes setUp et tearDown pour avant et après.

    Hors dans le tuto ta classe ne doit pas étendre TestCase. Pour que l'interpreteur JUnit regarde les @before et @after (pour les majuscule je ne sais pas du tout si c'est obligatoire).
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

  11. #11
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 897
    Points
    1 897
    Par défaut
    Citation Envoyé par maxf1
    Tu as essaye en n'étendant pas ta classe de TestCase car c'est surement ca le souci!! Etant donnée que ca étant TestCase il veut les methodes setUp et tearDown pour avant et après.

    Hors dans le tuto ta classe ne doit pas étendre TestCase. Pour que l'interpreteur JUnit regarde les @before et @after (pour les majuscule je ne sais pas du tout si c'est obligatoire).
    Oui, maintenant cela fonctionne mais l'appel de la classe dans le TestSuite ne fonctionne plus puisqu'il attend un TestCase (en caractère gras) :

    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
    package user;
    
    import junit.framework.Test;
    import junit.framework.TestSuite;
    
    public class AllTests
    {
        public static Test suite()
        {
            TestSuite suite = new TestSuite("Test for user");
            //$JUnit-BEGIN$
            suite.addTestSuite(UtilisateurTest.class);
            //$JUnit-END$
            return suite;
        }
    
    }
    On tourne en rond dans cette histoire.
    La connaissance ne sert que si elle est partagée.
    http://ms2i.net

  12. #12
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    m'enfin on tourne pas trop en rond c'est juste que maintenant ta classe de test marche suivant le model 4.x

    Le probleme est qu'apparement testSuite ne marche pas avec 4.x puisque les classes n'implémente pas testCase. Donc il y a 2 solutions:

    tu extends testCase mais tes methodes doivent obligatoirement s'appeler setUp et tearDown et dans ce cas tu peux utiliser testSuite.

    tu n'etends pas testCase et tu peux appeler tes methodes comme tu le souhaite avec @before et @after mais dans ce cas tu dois trouver un parade a testSuite (etant donné que je suis toujours en 3.8 depuis tout à l'heure je n'ai pas ce probleme). La nouveauté c'est bien mais quand c'est trop neuf y manque des trucs.....
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

Discussions similaires

  1. Les champs de mon objet deviennent null sur GlassFish
    Par JacNar6 dans le forum Glassfish et Payara
    Réponses: 6
    Dernier message: 13/09/2013, 17h13
  2. Réponses: 1
    Dernier message: 12/12/2008, 08h57
  3. Erreur sur un test Null d'un champ Null
    Par RudyWI dans le forum VBA Access
    Réponses: 6
    Dernier message: 20/05/2008, 13h33
  4. [Objet] Test de valeur null
    Par Mister Nono dans le forum Struts 1
    Réponses: 4
    Dernier message: 16/03/2007, 09h03
  5. Contraite NULL sur une colonne en fonction d'une autre colon
    Par speedy1496 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2004, 19h29

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