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 :

test une methode d'insert d'un dao avec DBUnit


Sujet :

Tests et Performance Java

  1. #1
    Membre éprouvé
    Avatar de foucha
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut test une methode d'insert d'un dao avec DBUnit
    Bonjour,

    Je voudrais faire un test tout bete de dao sur sa méthode d'insertion et que cette donnée ajoutée soit automatiquement supprimée par DBUnit. Ca me semble etre un besoin courant.

    DBUnit permet de tester l’intégration de la base en passant un fichier de données en entrée. C’est l’état de la base à l’origine.

    Je définis un fichier de sortie pour lui dire ce que j’attends à la fin.

    DBUnit nettoie la base en enlevant les données qui avaient été definis en input.

    Donc ça, ça marche bien quand je teste des methodes de sélection de données du DAO.

    Par contre, là je veux tester une méthode d’insertion. Résultat : DBUnit nettoie la base conformément au fichier d’entrée, mais il laisse la ligne ajoutée par la méthode du DAO en base…..

    Le test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dbUnitFixture.setOutputFileName("LeaOffreAnswerDao_insert_output.xml");
    dbUnitFixture.cleanInsertFromInputDataSet();
    analyzeDao.insert(LeaOffreFactoryTestHelper.createAnswer("2", true));
    dbUnitFixture.assertTables("LEA_OFFRE_ANALYZE");
    Merci pour toute aide !

    ++
    Foucha.
    ++
    Foucha.

    =========

    "du code propre c'est du code qui fait exactement ce qu'on croit que ça fait"

    Mes Articles DVP

  2. #2
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Par défaut
    De mémoire c'est par la méthode onTearDown que DBUnit effectue son nettoyage.

    Regarde l'exemple ici : http://dbunit.sourceforge.net/howto.html

    Il faut peut être faire un setTearDownOperation(DatabaseOperation.DELETE_ALL) car je crois que par défaut c'est NONE.

  3. #3
    Membre éprouvé
    Avatar de foucha
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut spring
    A y est j'ai trouvé ! La solution est ici :http://tadaya.wordpress.com/2008/04/...ate-in-spring/

    Je me disais que c’était gros quand même, de pas pouvoir rollbacker des inserts non définis dans le XML. En fait DBUnit fait bien une transaction, qu’il rollbacke. Ce n’est pas un delete where des ids trouvés dans le XML d’input.

    Par contre là où ça ne fonctionnait pas, c’est que l’action de ma DAO est faite dans une autre transaction. Du coup c’était pas rollbacké !

    Il suffit de changer la datasource dans le fichier de conf spring pour lui dire d’exécuter l’ensemble du test dans la même transaction :


    <bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg ref="dataSource"/>
    </bean>

    Bon par contre le problème maintenant, c'est que d'un test à l'autre, je reste dans la même transaction. Du coup je ne peux pas faire plusieurs inserts de la meme clef à la suite => il faudrait forcer le rollback entre chaque test. Une idée?

    Merci !
    Foucha.
    ++
    Foucha.

    =========

    "du code propre c'est du code qui fait exactement ce qu'on croit que ça fait"

    Mes Articles DVP

  4. #4
    Membre éprouvé
    Avatar de foucha
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut
    Citation Envoyé par nrichand Voir le message
    De mémoire c'est par la méthode onTearDown que DBUnit effectue son nettoyage.

    Regarde l'exemple ici : http://dbunit.sourceforge.net/howto.html

    Il faut peut être faire un setTearDownOperation(DatabaseOperation.DELETE_ALL) car je crois que par défaut c'est NONE.
    en fait, meme en appelant explicitement le DELETE_ALL, cela ne fonctionnait pas pour la ligne insérée par le DAO (par contre, cela fonctionnait bien pour les lignes du fichier input). Du fait que ce n'était pas la meme transaction.

    Au moins ce problème est résolu avec l'autre datasource. Par contre, meme en activant le rollbackByDefault=yes, si deux tests inserent la meme donnée j'obtiens un primary key exception. Comme s'il ne rollbackait que dans le scope de la classe, pas de la méthode.

    ++
    Foucha.

    ++
    Foucha.
    ++
    Foucha.

    =========

    "du code propre c'est du code qui fait exactement ce qu'on croit que ça fait"

    Mes Articles DVP

Discussions similaires

  1. Test d'existence d'une table avant insertion
    Par YavaDeus dans le forum PL/SQL
    Réponses: 2
    Dernier message: 22/04/2009, 12h10
  2. [DBUnit] Test Unitaire de dao avec DbUnit & HSQLDB
    Par ReaM dans le forum Tests et Performance
    Réponses: 0
    Dernier message: 16/03/2009, 10h51
  3. [MFC] Passage d'une structure dans une method
    Par KPitN dans le forum MFC
    Réponses: 5
    Dernier message: 18/06/2004, 10h11
  4. [Reflection][Bean] Appel d'une méthode dynamiquement
    Par eraim dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/04/2004, 11h07

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