2010-11-26 29 views
5

Je voudrais tronquer toutes mes tables de base de données entre un test d'intégration à un autre. Quelle est la meilleure façon de le faire en utilisant Hibernate?Le meilleur moyen de tronquer toutes les tables avec Hibernate?

Actuellement, je fais ceci:

public void cleanDatabase() { 
     doWithSession(new Action1<Session>() { 
      @Override 
      public void doSomething(Session session) { 
       SQLQuery query = session.createSQLQuery("truncate table stuff"); 
       // todo - generify this to all tables 
       query.executeUpdate(); 
      } 
     }); 

(doWithSession est une petite enveloppe qui crée et ferme une session). Je pourrais itérer sur tous mes objets mappés en utilisant la réflexion ... Je me demande si quelqu'un a déjà résolu ce problème.

Répondre

3

Je suppose que vous n'utilisez probablement pas Spring. Si vous l'avez fait, Spring's transactional test support serait idéal. En bref: Spring démarre automatiquement une transaction avant chaque test et la restaure automatiquement après le test élémentaire, vous laissant une base de données vide (ou au moins inchangée).

Peut-être que vous pourriez tout simplement imiter ce mécanisme:

Ouvrir une transaction dans une méthode @Before, rouler en arrière dans une méthode @After.

+0

Mais ... mais ... je veux affirmer des choses sur la base de données. Pour cela, je dois vraiment y mettre des choses. – ripper234

+3

@ ripper234 Vous pouvez affirmer parfaitement des choses, aussi longtemps que vous le faites dans le cadre de la transaction – Qwerky

+0

@ Qwerky - hmm, semble alors une approche intéressante. Je vais essayer, merci. – ripper234

0

Vous pouvez probablement supprimer et recréer le schéma Hibernate en utilisant SchemaExport, bien que cela semble assez lourd. Rétablir une transaction semble être une meilleure idée.

0

Vous pouvez utiliser une base de données in memmory et déposer la base de données complète entre vos tests.

Vous pouvez utiliser cette méthode si vous n'avez pas beaucoup mais de longs tests. Mais n'oubliez pas que chaque base de données se comporte différemment de toutes les autres. Donc, l'utilisation d'une base de données en mémoire (par exemple HyperSQL) ne se comportera pas exactement comme votre base de données normale dans certains cas - ce n'est donc pas un test d'intégration correct.