[TP Commit] Question 3, tests de transaction

Programmation Avancée

Moderator: douinj

Post Reply
delaba_q
Posts: 26
Joined: 03 Oct 2021 0:47

[TP Commit] Question 3, tests de transaction

Post by delaba_q » 24 Nov 2021 13:17

Bonjour,

En préparant le code pour répondre à la question 3, j'ai constaté que le premier test (testDebitEnErreur) est effectivement en erreur. La dernière méthode d'assertion fait planter le test, car le débit sur le groupe de contributeurs n'est pas transactionnel, donc l'ancien solde ne peut pas être égal au nouveau solde.

J'ai corrigé de mon côté pour que les tests passent, mais est-ce bien une erreur ?

EDIT : d'ailleurs, en exécutant les tests JNEWS, j'ai 5 erreurs sur le Memento, "setState en échec ???", j'imagine que les tests côté JNEWS n'apprécient pas que je fasse une copie du paramètre à chaque affectation de l'état interne du memento ?

douinj
Posts: 462
Joined: 18 Mar 2009 15:46

Re: [TP Commit] Question 3, tests de transaction

Post by douinj » 24 Nov 2021 16:54

EDIT : d'ailleurs, en exécutant les tests JNEWS, j'ai 5 erreurs sur le Memento, "setState en échec ???", j'imagine que les tests côté JNEWS n'apprécient pas que je fasse une copie du paramètre à chaque affectation de l'état interne du memento ?
Bonjour, c'est curieux, je n'ai pas votre tentative dans la base ...

Code: Select all

    public void testMementoUnSeulContributeur(){
        Cotisant c = new Contributeur("c",300);
        Memento memento1 = new Memento(c);
        try{
            c.debit(100);
        }catch(Exception e){
            fail("debit simple d'un contributeur : une exception ???");
        }
        
        Memento memento2 = new Memento(c);
        memento1.setState(c);
        assertEquals("Memento, setState en échec ???", 300, c.solde());
        memento2.setState(c);
        try{
            c.debit(100);
        }catch(Exception e){
            fail("debit simple d'un contributeur : une exception ???");
        } 
        assertEquals("Memento", 100, c.solde());

    }

delaba_q
Posts: 26
Joined: 03 Oct 2021 0:47

Re: [TP Commit] Question 3, tests de transaction

Post by delaba_q » 25 Nov 2021 8:09

En effet j'ai soumis 2 fois mon code mais j'ai eu à chaque fois "tentative (1/6)", je n'y ai pas fait attention...

Je retenterai ce soir, pour voir si la tentative est prise en compte et ce que me dit JNEWS. Par contre, je ne vois pas ce que doit faire le test :
  • on déclare un contributeur,
  • on déclare un premier memento avec le contributeur (en admettant que l'état est copié à la création),
  • on débite le contributeur de 100 (donc solde à 200),
  • on déclare un deuxième memento avec toujours le même contributeur,
  • on affecte l'état du premier memento avec le contributeur (toujours en admettant que l'état est copié à l'affectation),
  • on fait un assertion sur le solde du contributeur
A moins que la méthode setState du memento aie un effet de bord (ce qui est une mauvaise pratique, en plus de ne pas respecter le pattern Memento), je ne vois pas comment le solde pourrait valoir autre chose que 200, ni l'intérêt de déclarer des mementos et de changer leur état.

douinj
Posts: 462
Joined: 18 Mar 2009 15:46

Re: [TP Commit] Question 3, tests de transaction

Post by douinj » 25 Nov 2021 10:36

Bonjour,

L'extrait du test fourni précédemment ne fait qu'une sauvegarde/restitution, ici plusieurs Mementos doivent co-exister (vérification d'un éventuel effet de bord du plus mauvais effet ;-)

Code: Select all

           public void testMementoUnSeulContributeur(){
        Cotisant c = new Contributeur("c",300);
        Memento memento1 = new Memento(c);  // sauvegarde de c memento1(c/300)
        try{
            c.debit(100);                   // solde de c == 200
        }catch(Exception e){
            fail("debit simple d'un contributeur : une exception ???");
        }
        
        Memento memento2 = new Memento(c); // sauvegarde de c memento2(c/200)
        memento1.setState(c);              // restitution de c memento1(c/300)
        assertEquals("Memento, setState en échec ???", 300, c.solde());
        memento2.setState(c);             // restitution de c memento2(c/200)
        try{
            c.debit(100);
        }catch(Exception e){
            fail("debit simple d'un contributeur : une exception ???");
        } 
        assertEquals("Memento", 100, c.solde()); // solde de c == 100

    }
Ici le composite n'est constitué que d'une feuille ...

Bonne transaction

delaba_q
Posts: 26
Joined: 03 Oct 2021 0:47

Re: [TP Commit] Question 3, tests de transaction

Post by delaba_q » 25 Nov 2021 23:54

Bonjour,

Merci pour les commentaires dans la méthode de test, je comprends mieux ce qui est attendu.

Post Reply