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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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)


+ Répondre à la discussion
Cette discussion est résolue.

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