TP7 - Question 2 -

Programmation Avancée

Modérateur : douinj

charp_n1
Messages : 33
Inscription : 07 oct. 2020 17:35

TP7 - Question 2 -

Message par charp_n1 » 24 nov. 2020 3:20

Bonjour à tous,

J'ai un test JNews en échec à la question 2 du TP7, et j'ai pu accéder aux sources (ce qui est d'ailleurs bien pratique).

Méthode :

Code : Tout sélectionner

test_lier_delierClasseLocaleAuTestEtActionListener()
Erreur :

Code : Tout sélectionner

assertTrue("echec lors de l'appel de delier ???", c.al == null);
Ce test utilise une ClasseLocaleAuTest dont je ne sais rien, je suppose qu'elle posède une propriété al qui renvoie le(s) listener(s) de l'objet.
Je pourrais donc comprendre que c.al renvoie null lorsqu'il n'y a plus de listener.

Mais lorsque j'ajoute un listener à un JButton, que je le retire et que je fais un getActionListeners(), j'obtiens un tableau vide d'ActionListeners, pas null... Or la classe ParIntrospection ne fait que déléguer l'appel de la méthode removeXXXListener(), je ne vois donc pas ce que je peux faire de plus pour me débarrasser d'un observateur.

Comme le test a déjà été réussi, je suppose que j'ai raté quelque chose...

douinj
Messages : 263
Inscription : 18 mars 2009 15:46

Re: TP7 - Question 2 -

Message par douinj » 24 nov. 2020 10:31

Bonjour, la classe locale au test est moins complexe que JButton ...je vous joins la classe et le test en question que je pourrais enrichir si nécessaire

Bonne fin de tp7q2

Code : Tout sélectionner

    // ------------------------------------------------------------------------------------------------------------------

    private class ClasseLocaleAuTest{
        public ActionListener al = null;
        public void addActionListener( ActionListener al){
            this.al = al;
        }

        public void removeActionListener(ActionListener l){
            this.al = null;
        }
    }

    public void test_lierClasseLocaleAuTestEtActionListener(){
        try{
            ClasseLocaleAuTest c = new ClasseLocaleAuTest();
            question2.ParIntrospection.lierSourceEtListener(c, new ActionListener(){
                    public void actionPerformed(ActionEvent e)  {                                 
                    }
                }
            );
            assertTrue("echec lors de la liaison par introspection ???", c.al != null);
        }catch(Exception e){
            //assertTrue(" NoSuchElementException est attendue ???", e instanceof NoSuchElementException); 
            fail(" pas d'exception attendue ici !!! "); 
        }
    }	 

    public void test_lier_delierClasseLocaleAuTestEtActionListener(){
        try{
            ClasseLocaleAuTest c = new ClasseLocaleAuTest();
            ActionListener actionListener = new ActionListener(){
                    public void actionPerformed(ActionEvent e)  {                                 
                    }
                };
            question2.ParIntrospection.lierSourceEtListener(c, actionListener);
            assertTrue("echec lors de la liaison par introspection ???", c.al != null);
            assertTrue("echec lors de la liaison par introspection ???", c.al == actionListener);
            question2.ParIntrospection.delierSourceEtListener(c, actionListener);
            assertTrue("echec lors de l'appel de delier ???", c.al == null);

        }catch(Exception e){
            fail(" pas d'exception attendue ici !!! "); 
        }
    }	 

charp_n1
Messages : 33
Inscription : 07 oct. 2020 17:35

Re: TP7 - Question 2 -

Message par charp_n1 » 24 nov. 2020 13:28

Bonjour,

Merci, je comprends mieux le problème...
J'utilise getXXXListeners() par invocation pour vérifier si l'observateur est déjà déclaré dans l'observable. Comme cette méthode n'existe pas dans ClasseLocaleAuTest, je déclenche une exception (mon programme considère que je tente de délier un observateur qui n'est pas lié).

Je vais modifier ma classe ParIntrospection pour ne plus utiliser que addXXXListener() et removeXXXListener() et vérifier si je passe encore les autres tests.

Mais si ClasseLocaleAuTest se comporte comme un observable Java "standard" (JButton, JScrollBar, PropertyChangeSupport), ne devrait-elle pas implémenter getXXXListeners() et renvoyer un tableau de listeners ?

Répondre