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
TP9 Q3
Modérateur : Douin
Re: TP9 Q3
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
Merci beaucoup pour cette aide précieuse!
Re: TP9 Q3
C'est passé merci!
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
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?
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();
}