TP9 Q3

Programmation Avancée

Modérateur : Douin

cr2017
Messages : 33
Inscription : 10 oct. 2017 9:05

TP9 Q3

Message par cr2017 » 09 janv. 2018 18:17

Bonjour,

J'ai deux erreurs dans JNEWS pour la TP9Q3:

1) testModificationAuditeur(question3): L'appel de update est-il sans effet ??? expected:<a@b...> but was:<nom_0@cnam...>
2) testUniciteIdPlusieursAuditeurs(question3): L'unicité des id est-il respecté ??? expected:<55> but was:<56>

Concernant 1) mes tests unitaires valident bien ma méthode update() . Elle appelle findAll(), trouve l'auditeur dans la liste récupérée (via l'ID de l'auditeur passé en argument), le supprime en se basant sur son index dans la liste, et insère celui passé en argument à ce même index, puis finalement réécrit le fichier. Quelle est la faille de cette démarche?

Pour le test 2) je ne vous pas comment il serait possible de créer des clés en double puisque ma méthode create(Auditeur a) regarde l'ID de la dernière entrée dans la liste et attribue cet ID + 1 à l'auditeur nouvellement inséré. Comment les tests peuvent-ils créer un doublon? En soumettant un fichier avec des clés dans le désordre?

Quelqu’un aurait une idée ?

Merci bien,

CR

Douin
Messages : 266
Inscription : 18 mars 2009 15:46

Re: TP9 Q3

Message par Douin » 10 janv. 2018 12:36

Bonjour, une aide possible: les deux tests jnews incriminés suivent ... toutes les tentatives infructueuses ont été supprimées de la base jnews...

Code : Tout sélectionner

 public void testModificationAuditeur() throws Exception{
    try{
      DAO<Auditeur,Integer> dao = DAOFactoryTests.getAuditeurDAO("file");
      int size = dao.findAll().size();
      
      Auditeur a0 = new Auditeur("nom_0","prenom_0","nom_0@cnam.fr");
      Auditeur a1 = new Auditeur("nom_1","prenom_1","nom_1@cnam.fr");
      dao.create(a0);
      dao.create(a1);

      a0.setEmail("a@b.fr");

      List<Auditeur> list = dao.findAll();
      Auditeur a = dao.retrieve(a0.getId());
      assertFalse("L'appel de setMail sur un auditeur en mémoire change-t-il l'e-mail de ce même auditeur sur fichier ???",a.getEmail().equals(a0.getEmail()));
      a.setEmail("a@b.fr");
      dao.update(a);
      Auditeur a2 = dao.retrieve(a0.getId());
      assertEquals("L'appel de update est-il sans effet ???",a.getEmail(),a2.getEmail());

    }catch(Exception e){
      fail("Exception inattendue ? " + e.getMessage()); 
    } 
 
  }

Code : Tout sélectionner

public void testUniciteIdPlusieursAuditeurs() throws Exception{
     try{
    DAO<Auditeur,Integer> dao = DAOFactoryTests.getAuditeurDAO("file");

    int size = dao.findAll().size();
    
    Auditeur[] t = new Auditeur[10];
    for(int i=0; i< t.length;i++){
      t[i] = new Auditeur("auditeur_"+(i+10),"prenom_"+(i+10),"nom_"+(i+10)+"@cnam.fr");
      dao.create(t[i]);
    }
    List<Auditeur> list = dao.findAll();
    Set<Integer> set = new TreeSet<Integer>();

    for(Auditeur a : list){
      set.add(a.getId());
    }
    assertEquals(" L'unicité des id est-il respecté ???",set.size(), list.size());
    //+10
    // après 3 retraits
    dao.delete(t[2].getId());
    dao.delete(t[1].getId());
    dao.delete(t[0].getId());
    try{
      Auditeur a = dao.retrieve(t[2].getId());
    }catch(Exception e){
    }
    list = dao.findAll();
    set = new TreeSet<Integer>();
    for(Auditeur a : list){
      set.add(a.getId());
    }
    assertEquals(" L'unicité des id est-il respecté ???" ,set.size(), list.size());
   }catch(Exception e){
    fail("Exception inattendue ? " + e.getMessage()); 
  }
  }

cr2017
Messages : 33
Inscription : 10 oct. 2017 9:05

Re: TP9 Q3

Message par cr2017 » 10 janv. 2018 12:45

Merci beaucoup pour cette aide précieuse!

cr2017
Messages : 33
Inscription : 10 oct. 2017 9:05

Re: TP9 Q3

Message par cr2017 » 10 janv. 2018 14:36

C'est passé merci!

Code : Tout sélectionner

Concernant 1) mes tests unitaires valident bien ma méthode update() . Elle appelle findAll(), trouve l'auditeur dans la liste récupérée (via l'ID de l'auditeur passé en argument), le supprime en se basant sur son index dans la liste, et insère celui passé en argument à ce même index, puis finalement réécrit le fichier. Quelle est la faille de cette démarche?
Mon erreur était dans la manière de déterminer l'index de l'objet à remplacer: les cas de tests JNEWS déclenchaient un bug qui mettait l'index à zéro, ce qui fait que le premier élément de la base était écrasé et remplacé par une clé en doublon... ce qui par la suite générait l'erreur dans le test d''unicité..

Si ça peut aider quelqu'un, ma solution:

Code : Tout sélectionner

   public void update(Auditeur a) throws Exception{
// à compléter
    List<Auditeur> liste = findAll();
    int index = 0;
    boolean match = false;
    for (Auditeur aa : liste)   {
        if (aa.getId() == a.getId())    {
            match = true;
            break;
        }
        index++;
    }
    if (match == false)
               throw new Exception();
    liste.set(index, a);
    PrintWriter pw = new PrintWriter(fileName);
    for (Auditeur aaa : liste)
       pw.println(aaa.toString());
    pw.close();

   }

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité