2010-01-15 23 views
3

Je vais écrire plusieurs tests d'intégration qui vont tester l'interatcion avec db. Pour chaque test, j'ai besoin d'un certain instantané de DB. Chaque instantané db enregistré dans le fichier .sql. Ce que je veux est d'exécuter certains fichiers de script dans certains méthode d'essai, comme ceci:Comment exécuter le fichier sql-script en utilisant Hibernate?

@Test 
public void test_stuff(){ 
    executeScript(finame.sql); 

    ... testing logic ... 

    clean_database(); 
} 

mise en veille prolongée a-t-des moyens de le faire?

Répondre

0

Vous pouvez mettre la main sur la connexion JDBC par l'instance de la session de mise en veille prolongée:

https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#connection()

Vous pouvez écrire votre méthode ExecuteScript() pour prendre le nom de fichier et une session de mise en veille prolongée et lire le fichier et exécutez le sql sur la connexion jdbc.

HTH

3
  • Vous pouvez exécuter automatiquement un script SQL au démarrage de veille prolongée: écrire vos commandes SQL dans un fichier appelé import.sql et le mettre dans la racine du CLASSPATH.

  • Vous n'avez pas besoin de nettoyer votre base de données pour votre test, il vous suffit de rendre votre test transactionnel à la fin de chaque test. Par conséquent, vous êtes sûr que votre base de données n'est pas contaminée par vos tests. Par exemple, en utilisant Spring:

    @Transactional 
    @TransactionConfiguration 
    public class MyTest { 
    ... 
    } 
    

Si vous ne l'utilisez Spring, essayez un cadre de test avec prise en charge des transactions par défaut-rollback.

+1

Rod Johnson parle de l'utilisation des transactions et rollback pour faire des tests d'intégration: http://www.infoq.com/ presentations/system-integration-testing-with-spring Vous pouvez passer à la barre des 30 minutes si vous connaissez déjà les raisons du test. – 0sumgain

+0

Intéressant mais un peu vieux: l'auteur parle de test avec AbstractTransactionnel ... test classe, qui est maintenant obsolète au printemps 3.0.0 en faveur de l'annotation @Transactionnal (et c'est une bien meilleure façon). – Kartoch

+0

@Kartoch en espérant que vous obtenez toujours ceci: j'ai essayé votre solution mais pas de chance, est toujours valide en hibernate 4? – jorrebor

0

Avez-vous entendu parler de Hypersonic SQL? C'est une base de données en mémoire où toutes vos tables résident dans la mémoire, puis faites votre test (avec Lire, mettre à jour, insérer, supprimer), enfin quand vous fermez, toutes les données ont disparu. En savoir plus: http://www.hsqldb.org/

+0

alternative pour la base de données en mémoire: h2 (http://www.h2database.com) – Kartoch

2

Le sujet de la méthode session.connection() est dépréciée dicussed here

+0

Je suis désolé mais ... comment est-ce pertinent à la question? –

+3

Lorsque vous essayez de récupérer la connexion JDBC pour exécuter votre script sql, la première chose que vous remarquerez est que la méthode est obsolète, mais il n'y a pas d'alternative recommandée pour la récupérer. – Rots