Bonjour,
Afin de permettre un RollBack d'une opération j'effectue une copie de mon objet initial via une sérialisation. L'objet étant relativement complexe ( Il contient plusieurs ArrayList avec des objets tiers ) cela m'a semblé être la méthode la plus simple.
Seulement, en cas de problème, si je fais un objetInitial = objetSaved ma référence est changée... Et donc mon test Junit ne marche pas étant donné que l'objet créé en son sein pointe toujours vers l'ancienne référence...
Grosso modo j'ai ceci :
Et dans mon JUNIT ceci :
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
41 public class TransactionDebitSure extends TransactionDebit{ Compte compte; Compte compteCopie; public TransactionDebitSure(Compte compte){ super(compte); this.compte = compte; } public void beginTransaction(){ try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(compte); oos.flush(); oos.close(); ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); compteCopie = (Compte)in.readObject(); System.out.println("Compte Copié"); System.out.println("Compte : "+compte.solde()); System.out.println("Compte Copie :"+compteCopie.solde()); } catch (IOException ioe){ ioe.getMessage(); } catch (ClassNotFoundException cnfe){ cnfe.getMessage(); } } public void endTransaction(){ compteCopie = null; } public void rollbackTransaction(){ System.out.println(compte); System.out.println(compteCopie); compte = null; compte = (Compte)compteCopie.clone(); System.out.println("Apres : "+compte); } }
Avec mes petits StackTrace j'obtiens ceci :
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 public void testTransactionDebitSure(){ Groupe g = new Groupe("g"); g.ajouter(new Cotisant("g_a",300)); g.ajouter(new Cotisant("g_b",200)); g.ajouter(new Cotisant("g_c",120)); Groupe g1 = new Groupe("g1"); g1.ajouter(new Cotisant("g1_a1",100)); g1.ajouter(new Cotisant("g1_b1",200)); g.ajouter(g1); Banque b = new Banque(); b.installerLesCommandes( new TransactionDebitSure(g), new CommandeCrediter(g)); int ancienSolde = g.solde(); System.out.println("Dans test : "+g); b.debiter(120); System.out.println(" solde erroné, revoyez la transaction !!! "+ g.solde() +" = " + ancienSolde); assertTrue(" solde erroné, revoyez la transaction !!! ", g.solde()==ancienSolde); }
Comme vous pouvez le constater je viens d'essayer en clonant mon nouvel objet dans l'initial, cela ne marche pas mieux. Quelqu'un pourrait t'il m'aiguiller?Dans test : question1.Groupe@18b3e8b
Compte Copié
Compte : 920
Compte Copie :920
question1.Groupe@18b3e8b
question1.Groupe@1655659
Apres : question1.Groupe@81f03
solde erroné, revoyez la transaction !!! 560 = 920
Merci beaucoup.
Partager