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

Spring Java Discussion :

Injection de dépendance et test


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Par défaut Injection de dépendance et test
    Bonjour,

    Je débute avec Spring, pour le moment j'ai une classe Manager et une classe Plugin. Ma classe plugin utilise mon manager.
    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
     
    @Component
    public class MyPlugin {
     
        @Autowired
        @Qualifier("default")
        private IManager manager;
     
        public MyPlugin() {
        }
     
        public void sayHello() {
            this.manager.sayHello();
        }
     
        public IManager getManager() {
            return this.manager;
        }
     
        public void setManager(final IManager manager) {
            this.manager = manager;
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Service
    @Qualifier("default")
    public class MyManager implements IManager {
     
        public void sayHello() {
            System.out.println("Hello From MyManager !!!");
        }
    }
    Je configure Spring dans mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static void main(final String[] args) {
            final ApplicationContext context = new AnnotationConfigApplicationContext(MyApplication.class);
            final MyPlugin plugin = context.getBean(MyPlugin.class);
            plugin.sayHello();
    }
    La classe MyApplication ne fait rien de particulier.

    Ce que je voudrais c'est trouver un moyen pour que dans un test par exemple, MyPlugin utilise une classe OtherManager:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Service
    public class OtherManager implements IManager {
     
        public void sayHello() {
            System.out.println("Hello From OtherManager!!!");
        }
    }
    Je ne sais pas comment faire. Sans changer dans le code le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Autowired
    @Qualifier("default")
    Merci d'avance pour votre aide,

    Virginie

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    La manière la plus simple, c'est de rajouter un Setter pour ton manager et de faire un plugin.setManager(managerDeTest) dans ton unit test.


    Ce n'est pas applicable à 100% des tests, notament ceux qui utiliseraient le manager durant la séquence de postinit, mais c'est déjà assez efficace

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    La manière la plus simple, c'est de rajouter un Setter pour ton manager et de faire un plugin.setManager(managerDeTest) dans ton unit test.


    Ce n'est pas applicable à 100% des tests, notament ceux qui utiliseraient le manager durant la séquence de postinit, mais c'est déjà assez efficace
    Merci, en effet, c'est efficace, mais j'aurai aimé trouvé une solution qui utiliserai les principes de spring.

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 136
    Par défaut
    Il est déconseillé de déclarer ses injections directement sur les attributs d'un classe.

    D’ailleurs un bon service/composant Spring doit pouvoir être testé sans Spring pour les test unitaire ( et je dit bien unitaire pas d’intégration).

    Donc plusieur solutions se pose a toi:

    1.
    créer un constructeur en autowired.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Component
    public class MyPlugin {
     
        private IManager manager;
     
        @Autowired
        public MyPlugin(@Qualifier("default")IManager manager) {
           this. manager  = manager;
     
        }
    Ou utiliser un setter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Component
    public class MyPlugin {
        public void setManager(final IManager manager) {
            this.manager = manager;
        }
     
    }
    et faire un test unitaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class testMyPlugin() {
     
     @test
     public void test(){
      //je cree mon service et les mock et je test
     }
     
    }
    2. faire un test d'integration
    Et pour cela il te faut utiliser le lanceur Junit de SPring.
    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
     
    @RunWith(SpringJUnit4ClassRunner.class)
    @Context(classes=MySpecificCLassConfig.class)
    public MyPluginIntegrationTest {
     
      @autowired
      private IManager manager;
     
     @test
     public void test(){
      //mon service et mes mock sont deja cree par la config specifique spring.
      //je test directement ce que je veux.
     }
     
    }

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Par défaut
    Merci pour ta réponse, je vais regarder ça

Discussions similaires

  1. [EJB3] [JBoss] Injection de dépendance circulaire ?
    Par Claythest dans le forum Java EE
    Réponses: 6
    Dernier message: 04/08/2009, 08h11
  2. [Framework] Injection de dépendances ; comment se passer du XML ?
    Par ummon99 dans le forum Spring
    Réponses: 3
    Dernier message: 12/01/2008, 09h19
  3. [EJB3] Injection de dépendance et Stateful
    Par newbeewan dans le forum Java EE
    Réponses: 1
    Dernier message: 15/05/2007, 07h33
  4. [Integration] [EasyMock] Injection de dépendance à l'éxécution
    Par frangin2003 dans le forum Spring
    Réponses: 2
    Dernier message: 06/03/2007, 11h06
  5. Spring + TagSupport et injection de dépendance
    Par worldchampion57 dans le forum Spring Web
    Réponses: 2
    Dernier message: 26/02/2007, 09h01

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