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 :

Utilisation des Mock au sein d'une application Spring


Sujet :

Tests et Performance Java

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut Utilisation des Mock au sein d'une application Spring
    Bonjour,

    Je suis entrain de faire mes tester unitaires sur une application Spring et là je bloque pour mes classes service.
    En effet, celles-ci appel mes classe DAO et quand je Mock, je me tape un null pointer exception.
    Voici ma classe de test;
    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
     
    public class UserServiceImplTest {
      private UserServiceImplWebService UserServiceWebService = new UserServiceImplWebService();
     
      @Autowired
      private IUserDao UserDao;
     
      private UserEntitie UserEntitie;
      @Before
      public void setUp() throws Exception {
        UserEntitie = EasyMock.createMock(UserEntitie.class);
        UserDao = EasyMock.createMock(IUserDao.class);
      }
     
      @Test
      public void enregistrerUser()
          throws EnregistrerUserException {
     
        Boolean retour;
     
        User User = new User();
        User.setNom("Test");
        User.setPrenom("Test");
     
        EasyMock.expect(UserDao.enregistrerUser(UserEntitie)).andReturn(true);
        EasyMock.replay(UserDao);
     
        retour = UserServiceWebService.enregistrerUser(User);
        EasyMock.verify(UserDao);
        Assert.assertTrue(retour);
      }
    }
    Classe DAO:
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    public class UserDaoImpl implements IUserDao {
      @PersistenceContext
      private EntityManager entityManagerFactory;
     
      /**
       * 
       */
      public List<UserEntitie> listerUser() throws ListerUserException {
        List<UserEntitie> listeUsers = null;
     
        try {
          listeUsers = (List<UserEntitie>) entityManagerFactory
              .createQuery("FROM UserEntitie", UserEntitie.class).getResultList();
        } catch (HibernateException e) {
          throw new ListerUserException("");
        }
     
        return listeUsers;
      }
     
      /**
       * 
       */
      public UserEntitie recupererUser(int identifiant)
          throws RecupererUserException {
        UserEntitie UserEntite = null;
     
        try {
          UserEntite = (UserEntitie) entityManagerFactory.find(UserEntitie.class,
              identifiant);
        } catch (HibernateException e) {
          throw new RecupererUserException("");
        }
     
        return UserEntite;
      }
     
      /**
       * 
       */
      public boolean enregistrerUser(UserEntitie User)
          throws EnregistrerUserException {
        boolean enregistrer = false;
        try {
          entityManagerFactory.persist(User);
          enregistrer = true;
        } catch (HibernateException e) {
          throw new EnregistrerUserException("");
        }
        return enregistrer;
      }
     
      /**
       * 
       */
      public boolean modifierUser(UserEntitie User)
          throws ModifierUserException {
        boolean modifier = false;
        try {
          entityManagerFactory.merge(User);
          modifier = true;
        } catch (HibernateException e) {
          throw new ModifierUserException("");
        }
        return modifier;
      }
     
      /**
       * 
       */
      public boolean supprimerUser(UserEntitie User)
          throws SupprimerUserException {
        boolean supprimer = false;
        try {
          entityManagerFactory.remove(entityManagerFactory.merge(User));
          supprimer = true;
        } catch (HibernateException e) {
          throw new SupprimerUserException("");
        }
     
        return supprimer;
      }
    }
    Classe Service à 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    public class UserServiceImplWebService implements IUserServiceWebService {
     
      @Autowired
      IUserDao UserDao;
     
      @Transactional(readOnly=true)
      public List<User> listerUser() throws ListerUserException {
        List<User> listeUsers = null;
     
        try {
          List<UserEntitie> listeUsersEntitie = UserDao.listerUser();
          if (listeUsersEntitie.size() == 0) {
            throw new ListerUserException("Aucun Users trouvé !");
          } else {
            listeUsers = new ArrayList<User>();
            for (UserEntitie unUser : listeUsersEntitie) {
              User User = new User();
              User.setIdentifiant(unUser.getIdentifiant());
              User.setNom(unUser.getNom());
              User.setPrenom(unUser.getPrenom());
     
              listeUsers.add(User);
            }
          }
        } catch (CannotCreateTransactionException e) {
          throw new ListerUserException("Erreur d'accès à la base de données !");
        }
     
        return listeUsers;
      }
     
      @Transactional(readOnly=true)
      public User recupererUser(int identifiant) throws RecupererUserException {
        User User = null;
     
        try {
          UserEntitie UserEntite = UserDao.recupererUser(identifiant);
          if (UserEntite == null) {
            throw new RecupererUserException(
                "Aucun Users trouvé pour l'identifiant choisit : " + identifiant + "!");
          } else {
            User = new User();
            User.setIdentifiant(UserEntite.getIdentifiant());
            User.setPrenom(UserEntite.getPrenom());
            User.setNom(UserEntite.getNom());
          }
        } catch (CannotCreateTransactionException e) {
          throw new RecupererUserException("Erreur d'accès à la base de données !");
        }
     
        return User;
      }
     
      @Transactional(readOnly=true)
      public boolean enregistrerUser(User User)
          throws EnregistrerUserException {
        boolean enregistrer = false;
     
        if (User.getNom() == null || User.getPrenom() == null) {
          throw new EnregistrerUserException(
              "Une ou plusieurs valeurs n'autorisent pas les valeurs nulles !");
        } else {
          UserEntitie UserEntitie = new UserEntitie();
          UserEntitie.setPrenom(User.getPrenom());
          UserEntitie.setNom(User.getNom());
     
          try {
            enregistrer = UserDao.enregistrerUser(UserEntitie);
          } catch (CannotCreateTransactionException e) {
            throw new EnregistrerUserException("Erreur d'accès à la base de données !");
          }
        }
        return enregistrer;
      }
     
      @Transactional(readOnly=true)
      public boolean modifierUser(User User) throws ModifierUserException {
        boolean modifier = false;
     
        if (User.getNom() == null || User.getPrenom() == null) {
          throw new ModifierUserException(
              "Une ou plusieurs valeurs n'autorisent pas les valeurs nulles !");
        } else {
          UserEntitie UserEntitie = new UserEntitie();
          UserEntitie.setIdentifiant(User.getIdentifiant());
          UserEntitie.setPrenom(User.getPrenom());
          UserEntitie.setNom(User.getNom());
     
          try {
            modifier = UserDao.modifierUser(UserEntitie);
          } catch (CannotCreateTransactionException e) {
            throw new ModifierUserException("Erreur d'accès à la base de données !");
          }
        }
        return modifier;
      }
     
      @Transactional(readOnly=true)
      public boolean supprimerUser(User User)
          throws SupprimerUserException {
        boolean supprimer = false;
        if (User.getNom() == null || User.getPrenom() == null) {
          throw new SupprimerUserException(
              "Une ou plusieurs valeurs n'autorisent pas les valeurs nulles !");
        } else {
          UserEntitie UserEntitie = new UserEntitie();
          UserEntitie.setIdentifiant(User.getIdentifiant());
          UserEntitie.setPrenom(User.getPrenom());
          UserEntitie.setNom(User.getNom());
     
          try {
            supprimer = UserDao.supprimerUser(UserEntitie);
          } catch (CannotCreateTransactionException e) {
            throw new SupprimerUserException("Erreur d'accès à la base de données !");
          }
        }
        return supprimer;
      }
     
    }
    Cela me proovque un null pointer exception sur enregistrer = UserDao.enregistrerUser(UserEntitie);
    J'ai l'impression que c'est à cause de EntityManagerFactory qui est null dans la DAO mais comme je mock la DAO, je suis pas censé avoir de problème. Je ne souhaite pas avoir de contact avec la bd quand je test ma classe service si j'ai bien compris le système de mock

    Merci de votre aide

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Tu mock mais tu ne l'injectes jamais... normal que ça soit null en face...

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Je doit l'injecter ou?

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Bah tant qu'à faire, autant le faire dans la partie d'initialisation du test...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Before
      public void setUp() throws Exception {
        UserEntitie = EasyMock.createMock(UserEntitie.class);
        UserDao = EasyMock.createMock(IUserDao.class);
        UserServiceWebService.setUserDao(UserDao);
      }
    EDIT: avec Mockito, tu pourrais utiliser les annotations @Mock et @InjectMocks pour simplifier cette partie. En EasyMock, je sais pas si c'est dispo

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Dans ma classe service, j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     @Autowired
      IUserDao UserDao;
    Je vois ne comprend pas pourquoi ici, il faut que je face un setDao alors que dans l'application telle quelle je n'en fait pas

  6. #6
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Je ne vois pas l’intérêt d'utiliser d'easymock si l'objectif n'est que de ne pas insérer les données de test dans la base. Je te conseille d'abord de lire cette documentation.

    A+.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Il faut donc que je face comment?

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Il faut que tu lises d'abord la documentation, corriger tes classes de tests et service (oui il y a pas mal de truc pas logique mais je ne vais pas te le dire). Tu devrais comprendre ce que tu devrais faire après que tu auras lu la doc.

    A+.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Je l'ai lu et je ne vois pas ou est le problème

  10. #10
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par totot Voir le message
    Je vois ne comprend pas pourquoi ici, il faut que je face un setDao alors que dans l'application telle quelle je n'en fait pas
    @Autowired (ou @Inject, qui serait un peu meilleure) est une annotation qui marche uniquement si ton objet est sous le contrôle d'un framework d'injection (Spring ou autres).

    Puisque dans ton cas, tu instancies toi-même l'objet avec un "new" explicite, il est hors-scope de Spring. Ce n'est pas un bean, donc tu ne peux pas bénéficier des fonctionnalités proposées par Spring, que cela soit l'injection des dépendances ou l'AoP, donc, tu dois faire l'injection (= mise en relation des objets les uns avec les autres) toi-même.

    Sinon, tel qu'indiqué précédemment, il serait peut être mieux de juste configurer les transactions pour forcer un rollback à la fin de chaque test, ou alors monter une datasource de test (type hsqldb ou h2, éventuellement sous contrôle de DBUnit) et faire tests avec celle-là.

    Tout dépend de ce que tu veux tester (l'intégration entre tes services/dao avec une db réelle => DAO réels + DB de test + év. DBUnit, ou alors le code business de tes services, de façon unitaire => DAO mocks)


  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Je veux tester le code business de tes services, de façon unitaire => DAO mocks)

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    As tu une idée de comment il faut faire

  13. #13
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    je te l'ai dit... garde tout comme c'est, mais injecte manuellement les références qui vont bien de tous les objets qui ne sont pas managés par spring.

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Comment je fait pour injecter car là je suis perdu.
    Car je me suis mi en mode débug et c'est le EntityManager entityManagerFactory qui est null

  15. #15
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    que l'entity manager soit null c'est normal... euh non en fait c'est bizarre, si tu es vraiment dans un mock, tu ne devrais même pas voir de référence à un entity manager...

    injecter manuellement = faire le mapping soit même des objets. C'est ce que j'avais indiqué dans mon deuxième post, ajouter la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    UserServiceWebService.setUserDao(UserDao);
    ...
    PS: au passage, regarde un peu les convention de nommage de java: une référence ne doit jamais commencer par une majuscule...

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    Du coup, je créer une méthode setUserDao dans le serveir?

  17. #17
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Non, le mieux c'est de faire de l'injection par constructeur - ça évite de prendre le risque d'avoir des objets incohérents à un instant T.

    Donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class UserServiceImplWebService implements IUserServiceWebService {
      private final IUserDao UserDao;
     
      @Autowired
      public UserServiceImplWebService(IUserDao userDao) {
        Validate.notNull(userDao);
        this.UserDao = userDao;
      }
    ...

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    J'ai fait dans la classe de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	private UserServiceImplWebService userServiceWebService = new UserServiceImplWebService(userDao);
    Et j'ai toujours mon null pointer exception

  19. #19
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    bah poste tout le code que tu as... si tu as mocké ton DAO correctement, tu ne peux plus avoir de nullpointer sur une référence vers un EntityManager, pour la simple et bonne raison que le mock ne fait pas de JPA et ne connais rien à JPA...

    donc si ça pète, c'est sûrement qu'à la place d'avoir un mock, tu as instancié un DAO concret...

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Par défaut
    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
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "classpath*:/applicationContext-test.xml" })
    public class UserServiceImplTest {
      private IUserDao userDao;
     
      private UserServiceImplWebService userServiceWebService = new UserServiceImplWebService(userDao);
     
      @Test
      public void enregistrerUserr() {
     
        Boolean retour;
     
        UserEntitie userEntite = new UserEntitie ();
        userEntite .setIdentifiant(1);
        userEntite .setNom("Test");
        userEntite .setPrenom("Test");
     
        User user = new User ();
        user .setNom("Test");
        user .setPrenom("Test");
     
        EasyMock.expect(userDao.enregistrerUser(userEntite)).andReturn(true);
        EasyMock.replay(userDao);
     
        retour = userServiceWebService.enregistrerUser(user);
     
        Assert.assertTrue(retour);
      }
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Utiliser deux SGBD au sein d'une même application
    Par franck2SK dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 10/11/2012, 21h24
  2. Réponses: 6
    Dernier message: 09/02/2011, 10h15
  3. Réponses: 2
    Dernier message: 02/06/2010, 14h28
  4. Réponses: 3
    Dernier message: 14/09/2006, 14h20
  5. Réponses: 7
    Dernier message: 27/10/2005, 14h24

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