2017-10-21 160 views
0

我在我的Java EE應用程序中與我的Wildfly服務器結合使用hibernate以將我的類保存在mysql數據庫中。 到目前爲止,這工作正常,但現在我正在編寫單元測試,並且我正在爲我得到的一些錯誤瘋狂。Java休眠JPA錯誤與JUnit測試

我想測試我DAO層在我的單元測試,但我得到這些錯誤:

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 

我的persistence.xml IST這樣的:

<?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> 

所以,我在這裏使用jta-data-source>,如你所見。

如果我刪除這條線,我的測試進行得很好!但我無法再用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"}} 

,因爲我在persistence.xml中

刪除行,他無法找到數據源如何管理讓我的應用程序都運行。測試和當然的maven構建?

這裏是我的測試:(設置已導致錯誤):

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); 
    } 

而且JPAHELPER類:

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(); 
    } 
} 

和吾道:

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數據源:

<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

您正在所謂的非託管環境中執行Unittest。所以沒有數據源,也沒有Wildfly。要麼創建RESOURCE_LOCAL persistence.xml,要麼使用Arquillian進行測試。告訴我你喜歡什麼,並告訴你如何做到這一點。 –

+0

你好,謝謝你的回答!如果你能給我一些關於RESOURCE_LOCAL的提示,那將是非常好的!謝謝 – Michael

+0

看看這個:http://in.relation.to/2016/01/14/hibernate-jpa-test-case-template/ –

回答

1

,因爲我在persistence.xml中

刪除行,他無法找到數據源如何管理讓我的應用程序都運行。

問題是數據源是由您的測試環境中不可用的Wildfly管理的。所以,你可以做的是定義兩個單獨的持久性單元(一個爲您的生產代碼,另一個用於測試),如下所示:

<?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> 

,然後在EmployeeDAOTest類修改以下行:

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

注:

  • 我刪除從primary持久單元的JDBC連接屬性,因爲你並不需要他們爲你已有的數據源有Ø Wild Wild。