2017-10-21 249 views
0

J'utilise hibernate dans mon application Java EE en combinaison avec mon serveur Wildfly pour persister mes classes dans une base de données mysql. Jusqu'à présent, cela fonctionne bien, mais maintenant j'écris des tests unitaires et je deviens fou de certaines erreurs que je reçois.Java hibernate erreur JPA avec JUnit Testing

Je voudrais tester mon OAC-couche dans mes tests unitaires mais je reçois ces erreurs:

Caused by: org.hibernate.engine.jndi.JndiException: Error parsing JNDI name [java:/MySqlDS] 
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial 

mon ist persistence.xml ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="primary"> 
     <jta-data-source>java:/MySqlDS</jta-data-source> 
     <class>org.se.bac.data.Employee</class> 
     <properties> 
      <!-- Properties for Hibernate --> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/empdb?useSSL=false"/> 
      <property name="hibernate.connection.username" value="student"/> 
      <property name="hibernate.connection.password" value="student"/> 


      <!-- 
       SQL stdout logging 
      --> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="use_sql_comments" value="true"/> 
     </properties> 
    </persistence-unit> 


</persistence> 

Alors, je suis ici en utilisant une jta-data-source> comme vous pouvez le voir. Si je retire cette ligne, mes tests se passent bien! Mais je ne peux plus construire mon projet avec maven.

Error: 
    Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 
    Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [com.mysql.jdbc.Driver] 
    Caused by: java.lang.ClassNotFoundException: Could not load requested class : com.mysql.jdbc.Driver"}} 

Il ne peut pas trouver la source de données parce que j'enlevé la ligne dans mon persistence.xml

Comment puis-je réussir à obtenir à la fois courir dans ma demande. Les tests et bien sûr la construction maven?

Voici mon test: (Le programme d'installation provoque déjà l'erreur):

package org.se.bac.data.dao; 

import java.util.List; 

import javax.persistence.EntityManager; 

import org.junit.After; 
import org.junit.AfterClass; 
import org.junit.Assert; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 
import org.se.bac.data.model.Employee; 

public class EmployeeDAOTest 
{ 
    private static final JdbcTestHelper JDBC_HELPER = new JdbcTestHelper(); 
    private final static JpaTestHelper JPA_HELPER = new JpaTestHelper(); 

    private EntityManager em = JPA_HELPER.getEntityManager("primary"); 
    private EmpDAO dao; 

    @BeforeClass 
    public static void init() 
    { 

     JDBC_HELPER.executeSqlScript("sql/test/dropEmployeeTable.sql"); 
     JDBC_HELPER.executeSqlScript("sql/test/createEmployeeTable.sql"); 
    } 

    @AfterClass 
    public static void destroy() 
    { 
     //JDBC_HELPER.executeSqlScript("sql/test/dropEmployeeTable.sql");  
    } 


    @Before 
    public void setUp() 
    { 
     JDBC_HELPER.executeSqlScript("sql/test/dropEmployeeTable.sql"); 
     JDBC_HELPER.executeSqlScript("sql/test/createEmployeeTable.sql"); 
     dao = new EmpDAOImpl();  
     dao.setEm(em); 

     JPA_HELPER.txBegin(); 


     Employee emp2 = new Employee(); 
     emp2.setFirstname("Max"); 
     emp2.setLastname("Muster"); 
     emp2.setHiredate("23-12-1991"); 

     dao.insert(emp2); 
    } 

Et JPAHELPER Classe:

package org.se.bac.data.dao; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.EntityTransaction; 
import javax.persistence.Persistence; 


public class JpaTestHelper 
{ 
    /* 
    * Property: persistenceUnitName 
    */ 
    private String persistenceUnitName; 
    public String getPersistenceUnitName() 
    { 
     return persistenceUnitName; 
    } 
    public void setPersistenceUnitName(String persistenceUnitName) 
    { 
     if(persistenceUnitName == null || persistenceUnitName.length() == 0) 
      throw new IllegalArgumentException("Illegal parameter persistenceUnitName = " + persistenceUnitName); 
     this.persistenceUnitName = persistenceUnitName; 
    } 


    /* 
    * Get an instance of the EntityManagerFactory. 
    */ 
    protected EntityManagerFactory getEnityManagerFactory() 
    { 
     if(persistenceUnitName == null) 
      throw new IllegalStateException("PersistenceUnitName must be set!"); 
     return Persistence.createEntityManagerFactory(persistenceUnitName); 
    } 


    /* 
    * Manage an EntityManager. 
    */ 

    private EntityManager em; 
    public EntityManager getEntityManager() 
    { 
     if(em == null) 
     { 
      em = getEnityManagerFactory().createEntityManager(); 
     } 
     return em;   
    } 
    public EntityManager getEntityManager(String persistenceUnitName) 
    { 
     setPersistenceUnitName(persistenceUnitName); 
     return getEntityManager();   
    } 


    public void closeEntityManager() 
    { 
     if(em != null) 
      em.close(); 
    } 


    /* 
    * Handle Transactions 
    */ 

    protected void txBegin() 
    { 
     EntityTransaction tx = em.getTransaction(); 
     tx.begin(); 
    } 

    protected void txCommit() 
    { 
     EntityTransaction tx = em.getTransaction(); 
     if(tx.getRollbackOnly()) 
     { 
      tx.rollback(); 
     } 
     else 
     { 
      tx.commit(); 
     } 
    } 

    protected void txRollback() 
    { 
     EntityTransaction tx = em.getTransaction(); 
     tx.rollback(); 
    } 
} 

et mon DAO:

package org.se.bac.data.dao; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import org.se.bac.data.model.Employee; 

class EmpDAOImpl // package private 
     implements EmpDAO 
{ 
    @PersistenceContext 
    private EntityManager em; 

    /* 
    * CRUD methods 
    */ 


    public Employee findById(int id) 
    { 
     System.out.println("empdaoimpl ID " + id); 
     return em.find(Employee.class, id); 
    } 






    public EntityManager getEm() { 
     return em; 
    } 

    public void setEm(EntityManager em) { 
     this.em = em; 
    } 





} 

wildfly Datasource:

<datasources> 
      <datasource jta="true" jndi-name="java:/MySqlDS" pool-name="MySqlDS" enabled="true" use-ccm="false"> 
       <connection-url>jdbc:mysql://localhost:3306/empdb?useSSL=false</connection-url> 
       <driver-class>com.mysql.jdbc.Driver</driver-class> 
       <driver>mysql-connector-java-5.1.44-bin.jar_com.mysql.jdbc.Driver_5_1</driver> 
       <security> 
        <user-name>student</user-name> 
        <password>student</password> 
       </security> 
       <validation> 
        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/> 
        <background-validation>true</background-validation> 
        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/> 
       </validation> 
      </datasource> 
     </datasources> 
+0

Vous exécutez votre Unittest dans un environnement dit non géré. Il n'y a donc pas de source de données et pas de Wildfly. Vous pouvez créer un fichier RESOURCE_LOCAL persistence.xml ou utiliser Arquillian pour le tester. Dites-moi ce que vous préférez et je vous montre la façon de le faire. –

+0

Bonjour, Merci pour votre réponse! Ce serait génial si vous pouviez me donner quelques conseils concernant RESOURCE_LOCAL! Merci – Michael

+0

Jetez un oeil à ceci: http://in.relation.to/2016/01/14/hibernate-jpa-test-case-template/ –

Répondre

1

Il ne peut pas trouver la source de données parce que j'enlevé la ligne dans mon persistence.xml

Comment puis-je réussir à obtenir à la fois courir dans ma demande.

Le problème est que la source de données est gérée par Wildfly qui n'est pas disponible dans votre environnement de test. Donc ce que vous pouvez faire est de définir deux unités de persistance séparées (une pour votre code de production et l'autre pour le test) comme suit:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="primary"> 
     <jta-data-source>java:/MySqlDS</jta-data-source> 

     <properties> 
      <!-- Properties for Hibernate --> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 

      <!-- SQL stdout logging --> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="use_sql_comments" value="true"/> 
     </properties> 
    </persistence-unit> 

    <persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL"> 
     <class>org.se.bac.data.Employee</class> 
     <properties> 
      <!-- Properties for Hibernate --> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/empdb?useSSL=false"/> 
      <property name="hibernate.connection.username" value="student"/> 
      <property name="hibernate.connection.password" value="student"/> 


      <!-- SQL stdout logging --> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="use_sql_comments" value="true"/> 
     </properties> 
    </persistence-unit> 

</persistence> 

puis dans votre classe EmployeeDAOTest modifier la ligne suivante:

private EntityManager em = JPA_HELPER.getEntityManager("testPU"); 

note:

  • Je supprimé les propriétés de connexion JDBC de l'unité de persistance primary parce que vous n'avez pas besoin d'eux comme vous avez déjà la source de données y o n Wildfly.