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 :

Problème dans le nettoyage du contexte entre les tests unitaires


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut Problème dans le nettoyage du contexte entre les tests unitaires
    Bonjour à tous,

    j'ai une suite de test JUnit 4 qui utilisent Spring (classes annotées par @RunWith(SpringJUnit4ClassRunner.class)).
    J'ai différents package de tests : un pour les dao, un pour les services, et un pour les pages web. Le contexte n'est pas le même en fonction du package : pour le package de test des pages, la base de données et initialisée, pour les autres non.

    Quand je lance les tests package par package, aucun problème, tous les tests passent. Par contre, quand je lance l'ensemble des tests d'un coup, l'une de mes classes de tests ne passe plus.

    Appelons TestPage cette classe de test qui ne marche plus. Comme son nom l'indique, cette classe de Test appartient au package des pages, et donc la base de données doit être initialisée. Voici le setup de TestPage :
    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
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("/applicationContext.xml")
    @DirtiesContext
    public class TestPage {
     
    	protected WicketTester tester;
     
    	@Autowired
    	private ApplicationContext applicationContext;
    	@Autowired
    	private ServiceMembre serviceMembre;
     
    	private Membre benji;
    	private SessionE4N session;
     
    	@Before
    	public void setup(){
    		tester = new WicketTester(new WicketApplication(){
     
    			@Override
    			protected SpringComponentInjector getSpringInjector() {
    				return  new SpringComponentInjector(this, applicationContext, true);
    			}
    		});
     
    		//recuperation de benji dans la BD
    		benji = serviceMembre.getOne("ben.joris");
     
    		tester.setupRequestAndResponse();
    		//on recupere la session et on insere Benji dedans pour pouvoir tester les pages de l'espace membre
    		session = SessionE4N.get();
    		session.setMembre(benji);
    	}
    ...
    }
    Les tests qui suivent ne passent pas car benji est null, alors que dans le fichier de conf, la base de données est censé être initialisée.

    appelons TestDao le test qui passe juste avant TestPage dans la suite des tests. Comme son nom l'indique, cette classe de tests appartient au package DAO et n'utilise donc pas le même contexte de base que TestPage. Dans cette classe, chaque test est inclu dans une transaction. Voici les méthodes setup et teardown de TestDao :
    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
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("TestDao-context.xml")
    @DirtiesContext
    @Transactional
    public class TestDao {
     
    	@Autowired
    	private ReponseDao reponseDao;
    	@Autowired
    	private ServiceQuestionnaire serviceQuestionnaire;
    	@Autowired
    	private ServiceMembre serviceMembre;
     
    	private Membre benji;
    	private Reponse reponse;
    	private Questionnaire q1;
     
    	@BeforeTransaction
    	public void startTransaction() throws ParseException{
    		benji = new Membre();
    		benji.setIdentifiant("ben.joris");
     
    		q1 = new Questionnaire();
    		q1.setNumero("Q1");
    		q1 = serviceQuestionnaire.saveOne(q1);
     
    		reponse = new Reponse();
    		reponse.setNumReponse(1);
    		reponse.setReponse("reponse 1");
     
    		//Mise à jour des références
    		reponse.setMembre(benji);
    		reponse.setQuestionnaire(q1);
    		q1.getListeReponses().add(reponse);
    		benji.getListeReponses().add(reponse);
     
    		//Persistence du membre et des réponses associées
    		benji = serviceMembre.saveOne(benji);
     
    		reponse = reponseDao.getOne(benji.getListeReponses().get(0).getIdReponse());
    	}
     
    	@AfterTransaction
    	public void afterTransaction(){
    		serviceMembre.deleteOne(benji);
    		serviceQuestionnaire.deleteOne(q1);
    	}
    En investiguant, j'ai remarqué qu'en supprimant l'annotation @AfterTransaction, les test de TestPage sont Ok.
    Il y a donc visiblement un problème dans le nettoyage du contexte entre les deux classes de tests. Je croyais pourtant que l'annotation @DirtiesContext forçait spring à recharger le contexte pour les tests de la classe suivante. Mais visiblement, ce n'est pas ce qui se passe ici.
    Il y a une subtilité qui m'échappe, j'espère que quelqu'un pourra éclairer ma lanterne sur le pourquoi du comment...

    Merci d'avance !

  2. #2
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    visiblement il y a peu de passage par ici, mais si quelqu'un a un idée qu'il hésite pas car j'ai toujours pas trouvé la solution au problème...

  3. #3
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    salut,

    je me permets de faire remonter le sujet car j'ai toujours pas trouvé de solution... Bon, sachant que y'a que dans Eclipse que certains tests passent pas, c'est pas super bloquant (pas de problème lors du build Maven par exemple).
    Mais bon, c'est assez frustrant d'avoir la barre rouge sous Eclipse tout en sachant que les tests sont bon mais qu'il y a un problème de contexte quelque part sans savoir comment le résoudre

Discussions similaires

  1. [1.x] Problème dans la partie backend causées par les relations M:M
    Par adrimax dans le forum Symfony
    Réponses: 2
    Dernier message: 12/03/2012, 15h13
  2. Send_mail dans les tests unitaires
    Par Snooky68 dans le forum Django
    Réponses: 0
    Dernier message: 05/03/2012, 17h57
  3. [EasyMock] utilisation des mock dans les test unitaires.
    Par jeremieG dans le forum Tests et Performance
    Réponses: 7
    Dernier message: 16/07/2010, 17h10
  4. Réponses: 0
    Dernier message: 23/07/2009, 15h45
  5. Calcul de la profondeur dans les tests unitaires
    Par alex.nd4 dans le forum Tests et Performance
    Réponses: 0
    Dernier message: 26/02/2009, 16h08

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