3

私のアプリケーションは playframework に基づいており、複数のモジュールが含まれています。データベースとの対話は JPA を通じて処理されます ( <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>)

私の仕事は、これらのモジュールの 1 つを単体テストでカバーすることです。

残念ながら、モジュール レベルで提供される単体テストで "play test" コマンドを実行すると、次の例外が発生します。

javax.persistence.PersistenceException: No Persistence provider for EntityManager named defaultPersistenceUnit

Persistence-Provider は conf/META-INF/persistence.xml でグローバルに (モジュールの外部で) 定義されており、グローバルな persistence.xml をモジュールにコピーしても問題は解決しません。

テストをモジュールの外側 (グローバル テスト ディレクトリ) に配置して実行すると、モジュール内に他のテストがないと仮定して問題なく動作します。

エラーが発生する理由を誰かが説明できますか? モジュール レベルで JPA 対応のテストを実行する方法はありますか?

前もって感謝します

ウルス

4

2 に答える 2

1

Eclipse で自分の play アプリケーションから JUnit テストを実行する際にも同じ問題がありました。

この問題を解決するには、フォルダーconfをすべてのプロジェクトで使用できるようにする必要があります。

Project Properties-> Java Build Path ->Source Add Folder を選択し、confフォルダーを選択します。

于 2014-06-04T13:46:29.987 に答える
0

私はあなたのコードをチェックしました。別のpersistence.xmlは必要ないと思います。play モジュールでこれらの解決策を試すことができますか:

@Test()
public void empty() {
    running(fakeApplication(), new Runnable() {
     public void run() {
       JPA.withTransaction(new play.libs.F.Callback0() {
        public void invoke() {
         Object o = new Object(someAttrib);
         o.save();
         assertThat(o).isNotNull();
       }
     });
    }
  });
}

または:

 @Before
    public void setUpIntegrationTest() {
        FakeApplication app = fakeApplication();
        start(app);
        em = app.getWrappedApplication().plugin(JPAPlugin.class).get().em("default");
        JPA.bindForCurrentThread(em);
    }

これらのコードはこのページからのものです。私はそれをテストしません!

コードを次のように変更してください。

@BeforeClass
public static void setUp() {
    FakeApplication app = fakeApplication(inMemoryDatabase());
    start(app);

    em = app.getWrappedApplication().plugin(JPAPlugin.class).get().em("default");
    JPA.bindForCurrentThread(em);
}

ぜひお試しください!

于 2013-11-13T09:52:24.153 に答える