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 :
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);
  }
 
}
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
  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);
 
	}
Avec mes petits StackTrace j'obtiens ceci :

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
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?

Merci beaucoup.