1. #1
    Membre du Club Avatar de hadler
    Inscrit en
    décembre 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : décembre 2004
    Messages : 88
    Points : 61
    Points
    61

    Par défaut Problème pour faire le mock d'une classe

    Bonjour,

    Je suis confronté à un problème durant l'un de mes tests et je ne vois pas comment le contourner.

    Voici la classe (et la méthode) que je veux tester
    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
    public void doCalculation(String idf, Calendar startDate)
        throws CalculationException
        {
            //Initialisation du profil
            Profil profil = null ;
     
            try {
                //Instancition du profil 
                profil = new profil(idf, startDate) ;
     
                //Lecture des données
                profil.read();
     
                if (startDate.before(profil.getGroup().getBeginDate())) {
                    throw new IncoherenceDateException("Incoherence date for idf " + profil.getIdf()) ;
                }
     
                processResult(profil);
    }
    Dans ma classe de test, ça donne ça :
    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
     
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(Profil.class)
    public class CalculationImplTest extends TestCase{
     
        @Spy
        Profil mockedProfil = new Profil ("123456789012", getStartDate(2017, Calendar.JANUARY, 1)) ;
     
        public void setUp() throws Exception {
            super.setUp();
            Mockito.doNothing().when(mockedProfil).readProfil();
        }
     
        public void testDoCalculationIncoherenceDate() throws Exception {
            Calendar startDate= Calendar.getInstance() ;
     
            CalculationImpl impl = new CalculationImpl() ;
            impl.doCalculation("001", startDate);
        }
    Mon mock sur la classe Profil n'a aucun impact et du coup l'appel de la méthode read est réalisé et fait planter le test.

    Est ce qu'il y a un moyen pour que je puisse mocker la classe Profil et simuler l'appel de la méthode read ?

    Pour le moment je travaille avec Mockito, mais j'ai aussi powermock dans mes dépendances et il est utilisé à d'autres endroits des tests.

    Merci d'avance,

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 211
    Points : 48 227
    Points
    48 227

    Par défaut

    Powermock supporte le mock des constructeurs.
    Tu décrit exactement leur exemple

    https://github.com/powermock/powermo...ockconstructor
    David Delbecq Java developer chez HMS Industrial Networks AB.     LinkedIn | Google+

  3. #3
    Modérateur
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2005
    Messages
    2 662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2005
    Messages : 2 662
    Points : 8 072
    Points
    8 072

    Par défaut

    Je passe par hasard sur ce fil, le plus logique reste d'écrire du code testable et donc d'ajouter un mécanisme d'injection de dépendances.
    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

    Trust me, i'm an engineer !
    https://www.youtube.com/watch?v=rp8hvyjZWHs

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 211
    Points : 48 227
    Points
    48 227

    Par défaut

    On pourrait effectivement envisager d'injecter une factory de profils. Mais ce n'est pas toujours faisable: on n'a pas toujours la possibilité d'ajouter du DI dans un projet et on ne peut pas se permettre de tout injecter. Même avec un DI on continue à utiliser des constructeurs pour beaucoup d'objets.

    Par contre, effectivement, je ne suis pas fan de mocker le constructeur, ça suppose que la méthode est obligée de passer par cet objet, or le but du test est de voir qu'on obtient bien un résultat donné. J'aurais plutôt opté pour l'option de mettre à disposition les données dont Profil aura besoin, histoire qu'il puisse fonctionner. De la même manière que si une classe utilise un new File(), je vais plus être tenté de créer le fichier dans le unit test que de mocker la classe File.
    David Delbecq Java developer chez HMS Industrial Networks AB.     LinkedIn | Google+

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/04/2010, 19h17
  2. Problème pour faire la rotation d'une image(Avec ImageJ)
    Par tadjara dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 12/04/2010, 12h48
  3. Réponses: 0
    Dernier message: 10/04/2010, 12h33
  4. Problème pour faire l'histogramme d'une image type png
    Par Patchanka dans le forum Images
    Réponses: 9
    Dernier message: 28/05/2009, 11h04
  5. problème pour faire un insert avec une image
    Par vbcasimir dans le forum Modules
    Réponses: 3
    Dernier message: 02/11/2005, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo