1

として登録されている JPA エンティティ ライフサイクル オブザーバーをテストしようとしているときに問題が発生しました。POST_COMMIT_INSERT

私のオブザーバーは Spring Bean であるため、次のようにエンティティ マネージャーに接続します。

private void configureHibernateHooks(HistoricEventListener<?> listener) {
    SessionFactory sessionFactory = getSessionFactory();

    EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService(
            EventListenerRegistry.class);

    if (listener instanceof PostInsertEventListener)
    {
        registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener((PostInsertEventListener) listener);
    }
}

SessionFactory getSessionFactory() {
    Session session = (Session) entityManager.getDelegate();
    SessionFactory sessionFactory = session.getSessionFactory();
    return sessionFactory;
}

私のテストには注釈が付けられてい@Transactionalます。したがって、私が理解しているように、各テストは独自のトランザクション内で実行されます。テスト中にトランザクションがコミットされないため、オブザーバー メソッドが呼び出されないため、POST_COMMIT_XXXリスナーが監視されません。

EntityManagerトランザクションを注入して手動でコミットしようとしましたが、例外が発生しました。

これらをテストするための適切な戦略は何ですか?

4

1 に答える 1

1

テスト メソッドで @Rollback(false) アノテーションを使用して、Spring にトランザクションをロールバックする代わりにコミットするように指示できます。

entityManger.flush() をトリガーするだけでも十分です。イベントのトリガーがトランザクションのコミットに関連付けられているとは思いません (名前が誤解を招く可能性があります)。

于 2012-09-06T04:07:26.083 に答える