2010-04-23 9 views
2

J'essaie d'implémenter des tests JUnit pour une classe qui effectue des requêtes de base de données en utilisant Hibernate. Lorsque je crée la classe en cours de test, j'avoir accès à la session par l'usine en procédant comme suit:Essayer de tester une classe qui effectue des requêtes DB à l'aide d'Hibernate et de la création de session impossible

InitialContext context = new InitialContext(); 
sessionFactory = (SessionFactory) context.lookup(hibernateContext); 

Cela fonctionne bien quand je déploie ce à JBoss 5.1. J'essaie de comprendre comment le faire fonctionner avec mon test JUnit. Je continue à obtenir une exception indiquant que "J'ai besoin de spécifier le nom de classe dans l'environnement ou la propriété système, ou comme un paramètre d'applet, ou dans un fichier de ressources d'application: java.naming.factory.initial". J'ai cherché haut et bas mais je n'ai pas été capable de trouver des informations sur ce que je dois faire pour que cela fonctionne. Je n'utilise pas Spring ou tout frameworks, tout simplement vieux Java et JUnit.

Répondre

2

Dans un contexte de test unitaire, vous très probablement ne voulez pas obtenir votre usine de session à partir JNDI (vous ne voulez pas démarrer JBoss pour les tests unitaires) et ma recommandation être d'utiliser un bon vieux HibernateUtilhelper class. Ci-dessous, un exemple très simple:

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class HibernateUtil { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
      // Create the SessionFactory from hibernate.cfg.xml 
      return new Configuration().configure().buildSessionFactory(); 
     } 
     catch (Throwable ex) { 
      // Make sure you log the exception, as it might be swallowed 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

} 

Juste au cas où, l'exemple d'application caveat emptor (la version native) a aa version plus avancée qui peut avoir une SessionFactory globale soit d'une variable statique ou une recherche JNDI (vous peut utiliser le même code dans et en dehors du conteneur).

Personnellement, j'ai utilisé the one de Cameron McKenzie pendant une longue période.

Puis, obtenez un Session à partir du SessionFactory et commencez/validez/annulez une transaction pour chaque méthode de votre test unitaire.