2017-10-21 21 views
0

私のJava EEアプリケーションでWildflyサーバーと組み合わせて、クラスをmysqlデータベースに永続化するために、hibernateを使用しています。 これまでのところうまくいきましたが、今は単体テストを書いています。私はいくつかのエラーについて狂っています。JUnitテストでJavaのhibernate JPAエラー

私は自分のユニット・テストでは、私の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:だから

<?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>を使用します。

この行を削除しても、テストはうまくいきます!しかし、私はもうプロジェクトをビルドすることはできません。

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

と私の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データソース:

<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

あなたは、いわゆる管理されていない環境でユニットテストを実行しています。したがって、データソースはなく、Wildflyもありません。 RESOURCE_LOCAL persistence.xmlを作成するか、Arquillianを使用してテストします。あなたの好きなことを教えてください。私はあなたにそれを行う方法を示します。 –

+0

こんにちは、ありがとうございますfprあなたの答え! 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"); 
をだからあなたは何ができるかを、次のように2つの別々の永続性ユニット(本番コード用とテスト用の他)を定義しています

注:

  • すでにOそこにデータソースを持っているとして、あなたがそれらを必要としないので、私はprimary永続ユニットからJDBC接続プロパティを削除n Wildfly
関連する問題