4

プロジェクトの単体テストを有効にしたい。次のような構造を作成しました。

ディレクトリ構造

.
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   └── resources
│   │       ├── META-INF
│   │       │   ├── beans.xml        <-- Works fine in live
│   │       │   └── persistence.xml  <-- Works fine in live
│   └── test
│       ├── java
│       │   ├── com
│       │   │   └── test
│       │   │       └── model
│       │   │           ├── TestEntityManagerUtil.java
│       │   │           └── TestHibernate.java
│       └── resources
│           ├── META-INF
│           │   ├── beans.xml
│           │   └── persistence.xml

コード

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">

        <description>TEST Persistence Unit</description>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>

            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
            <property name="hibernate.connection.url" value="jdbc:mysql://XXX:3306/X" />
            <property name="hibernate.connection.username" value="X" />
            <property name="hibernate.connection.password" value="X" />

            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.transaction.flush_before_completion" value="true" />
        </properties>
    </persistence-unit>
</persistence>

TestEntityManagerUtil.java

public class TestEntityManagerUtil {
    public static EntityManagerFactory getEntityManagerFactory(){
        return Persistence.createEntityManagerFactory("test");
    }
}

TestHibernate.java

public class TestHibernate {

    private EntityManager em;

    @Before
    public void beforeEach(){
        // Exception occurs here
        em = TestEntityManagerUtil.getEntityManagerFactory().createEntityManager();
    }

    @After
    ....

    @Test
    ....
}

例外

javax.persistence.PersistenceException: No Persistence provider for EntityManager named test
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:69)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
    at com.wellclub.model.TestEntityManagerUtil.getEntityManagerFactory(TestEntityManagerUtil.java:12)
    at com.wellclub.model.TestHibernate.beforeEach(TestHibernate.java:24)

テストpersistence.xmlは、target/test-clasesディレクトリ内でそのまま展開されます。

誰かが私が間違っていることを私に助けてもらえますか?

4

1 に答える 1

10

Maven POM で JPA 実装ライブラリ (Hibernate) の依存関係を確認してください。

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>${hibernate-core-version}</version>
</dependency>'

それ以外の場合は、非 Maven プロジェクトに hibernate-entityManager.jar を追加します

編集:

使用している JBoss の例は、CDI インジェクションを使用して EntityManager を取得する EE アプリケーションであることに注意してください。主な誤解は、JUnit テストが EE アプリケーションで動作すると仮定することです....いいえ、JUnit テストは JBoss コンテナーを実行することも、プロジェクトをデプロイすることもできません。それでも、http://arquillian.org/invasion/を参照して、arquillian テストの JBoss の例に気付くことができます。

つまり、JUnit は EntityManager をテストする SE の方法であり、JBoss のようなアプリケーション サーバーでは動作しません。

于 2012-11-21T03:07:54.820 に答える