IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tests et Performance Java Discussion :

Problème pour faire le mock d'une classe


Sujet :

Tests et Performance Java

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 91
    Points : 63
    Points
    63
    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 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Powermock supporte le mock des constructeurs.
    Tu décrit exactement leur exemple

    https://github.com/powermock/powermo...ockconstructor

  3. #3
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 608
    Points
    19 608
    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.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "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

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

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

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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.

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. Problème pour faire la rotation d'une image(Avec ImageJ)
    Par tadjara dans le forum Débuter avec Java
    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