Page 1 sur 1

TP9 Q3

Publié : 09 janv. 2018 18:17
par cr2017
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

Re: TP9 Q3

Publié : 10 janv. 2018 12:36
par Douin
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()); 
  }
  }

Re: TP9 Q3

Publié : 10 janv. 2018 12:45
par cr2017
Merci beaucoup pour cette aide précieuse!

Re: TP9 Q3

Publié : 10 janv. 2018 14:36
par cr2017
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();

   }