2017-07-02 3 views
0

J'ai un projet avec Hibernate configuré:Créer contexte JNDI Mise en veille prolongée dans le test unitaire

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.show_sql">true</property> 
     <property name="hibernate.format_sql">true</property> 
     <property name="jndi.url">jdbc/sqliteDB</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.SQLiteDialect</property> 
     <property name="hibernate.connection.driver_class">org.sqlite.JDBC</property> 
     <property name="hibernate.connection.release_mode">auto</property> 
     <property name="current_session_context_class">thread</property> 
     <property name="hibernate.connection.autoReconnect">true</property> 
     <property name="hibernate.hbm2ddl.auto">update</property> 
     <mapping class="com.web.models.SystemUsers"/> 
    </session-factory> 
</hibernate-configuration> 

Je veux exécuter des fichiers JUnit afin de tester l'approvisionnement de base de données. Je crée ce fichier Junit:

@BeforeClass 
    public static void setUp() throws Exception 
    { 
     try 
     { 
      // Create initial context 
      System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory"); 
      System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming"); 
      InitialContext ic = new InitialContext(); 

      ic.createSubcontext("java:"); 
      ic.createSubcontext("java:/comp"); 
      ic.createSubcontext("java:/comp/env"); 
      ic.createSubcontext("java:/comp/env/jdbc"); 

      SQLiteDataSource ds = new SQLiteDataSource(); 
      ds.setUrl("jdbc:sqlite:/C:/sqlite/test.sqlite"); 

      ic.bind("jdbc/sqliteDB", ds); 
     } 
     catch (NamingException ex) 
     { 
      Logger.getLogger(SQLiteDataSource.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

Mais quand je le lance, je reçois cette erreur:

SEVERE: null 
javax.naming.NameNotFoundException: Name [jdbc/sqliteDB] is not bound in this Context. Unable to find [jdbc]. 
    at org.apache.naming.NamingContext.bind(NamingContext.java:896) 
    at org.apache.naming.NamingContext.bind(NamingContext.java:192) 
    at org.apache.naming.NamingContext.bind(NamingContext.java:209) 
    at javax.naming.InitialContext.bind(InitialContext.java:425) 
    at com.net.server.UserProvisionTest.setUp(UserProvisionTest.java:39) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68) 

Savez-vous comment je crée le contexte JNDI afin que veille prolongée peut l'utiliser pour les requêtes de base de données?

Mise à jour. Maintenant, je reçois cette erreur:

listUsersTest(com.net.server.UserProvisionTest) Time elapsed: 0.001 sec <<< ERROR! 
java.lang.NoClassDefFoundError: Could not initialize class com.web.models.HibernateUtil 

J'utilise cette classe usine de mise en veille prolongée:

public class HibernateUtil 
{ 
    private static final SessionFactory sessionFactory; 
    private static ServiceRegistry serviceRegistry; 

    static 
    { 
     try 
     { 
      StandardServiceRegistry standardRegistry 
       = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build(); 
      Metadata metaData 
       = new MetadataSources(standardRegistry).getMetadataBuilder().build(); 
      sessionFactory = metaData.getSessionFactoryBuilder().build(); 
     } 
     catch (Throwable th) 
     { 
      System.err.println("Enitial SessionFactory creation failed" + th); 
      throw new ExceptionInInitializerError(th); 
     } 
    } 

    public static SessionFactory getSessionFactory() 
    { 
     return sessionFactory; 
    } 
} 

Edit: Ceci est mon fichier POM:

<dependencies> 
     <dependency> 
      <groupId>org.glassfish</groupId> 
      <artifactId>javax.faces</artifactId> 
      <version>2.3.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>5.2.10.Final</version> 
     </dependency> 
     <!-- SQLite JDBC library --> 
     <dependency> 
      <groupId>org.xerial</groupId> 
      <artifactId>sqlite-jdbc</artifactId> 
      <version>3.18.0</version> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
      <scope>test</scope> 
      <type>jar</type> 
     </dependency> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-web-api</artifactId> 
      <version>7.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <!--JBoss/Weld Refrence Implementation for CDI on a Servlet Container --> 
     <dependency> 
      <groupId>org.jboss.weld.servlet</groupId> 
      <artifactId>weld-servlet</artifactId> 
      <version>2.4.3.Final</version> 
      <type>jar</type> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.mail</groupId> 
      <artifactId>javax.mail</artifactId> 
      <version>1.5.6</version> 
      <type>jar</type> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.el</groupId> 
      <artifactId>el-ri</artifactId> 
      <version>1.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.shiro</groupId> 
      <artifactId>shiro-core</artifactId> 
      <version>1.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.shiro</groupId> 
      <artifactId>shiro-web</artifactId> 
      <version>1.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.omnifaces</groupId> 
      <artifactId>omnifaces</artifactId> 
      <version>2.6.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.primefaces</groupId> 
      <artifactId>primefaces</artifactId> 
      <version>6.1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat</groupId> 
      <artifactId>catalina</artifactId> 
      <version>6.0.53</version> 
      <scope>test</scope> 
     </dependency> 
     <!-- 
     <dependency> 
      <groupId>org.primefaces.themes</groupId> 
      <artifactId>all-themes</artifactId> 
      <version>1.0.10</version> 
     </dependency> 
     --> 
    </dependencies> 

Répondre

1

vous essayez bind dans le mauvais sens. au lieu de

ic.bind("jdbc/sqliteDB", ds);

ce faire,

c.bind("java:/comp/env/jdbc/sqliteDB", ds);

vous Sould lier (ajouter) à java:/comp/env/jdbc comme il est sous-contexte.


fix: pour la deuxième exeption - au lieu de:

< property name = "de jndi.url"> jdbc/sqliteDB </property>

ajouter ceci:

< propriété name = "hibernate.connection.datasource"> java: comp/env/jdbc/sqliteDB </propriété>

+0

merci. J'ai mis à jour mon message. J'ai ajouté par classe d'usine Hibernate et classe d'erreur. Savez-vous que ma classe d'usine est fausse? –

+0

J'ai ajouté mes dépendances dans mon fichier POM. –

+0

vous n'avez pas configuré la connexion avec la source de données – xyz