Не удается найти сущности в PersistenceContext после .persist () - PullRequest
0 голосов
/ 19 августа 2011

Я пишу проект JavaEE и пытаюсь получить некоторые модульные тесты в пути.Платформа для модульного тестирования, которую мы используем, - это JUnit, наряду с Maven и Hudson для сборки и CI.

Среди других тестов я бы хотел протестировать JPA-2.0 логику запроса , так какодна из основных функциональных возможностей нашего проекта.Мы реализовали довольно сложную логику запросов, которая также позволяет пользователю совершать ошибки, неправильно писать слова и т. Д., Поэтому мы хотим убедиться, что это работает.

Сами запросы динамически создаются с использованием API критериев JPA-2.0 иMetamodel API.

Теперь в своем модульном тесте я настроил постоянство и создал EntityManager следующим образом:

protected static EntityManagerFactory emf;
protected static EntityManager em;
emf = Persistence.createEntityManagerFactory("persistenceUnitName");
em = emf.createEntityManager();

Это работает, и я также могу запрашивать БД - но это не то, чтоЯ хочу.

Что я пытаюсь сделать:
Поскольку мы не хотим тестировать данные в БД, планируется сначала создать некоторые объекты, а затем сохранить их.,Затем мы запустили наши запросы и убедились, что получили правильные результаты.Наконец, поскольку постоянство модульного тестирования не выполняется в транзакции, сущности никогда не сохраняются в БД, а БД остается неизменной (что нам и нужно).

Entity entity = new Entity();
entity.setAttribute("stuff");
//...
em.persist(entity);
// ...
// Here comes the query which should find above entity with attribute 'stuff'...

Но.Независимо от того, какую сущность я создаю и сохраняю в модульном тесте, не можно найти в рамках одного и того же теста (или даже метода).Я могу успешно запрашивать БД и находить оттуда сущности, но недавно сохраненных тестовых случаев там нет.

Полагаю, я неправильно понял некоторую важную вещь в JPA о контексте постоянства - я был бы рад, если бы кто-то смог просветитьмне!:)

Если это важно, вот как выглядит файл persistence.xml, используемый тестами:

<persistence-unit name="persistenceUnitName" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <!-- list of classes to manage -->
  <properties>
    <!-- driver and connection info, this works-->
  </properties>
</persistence-unit>

1 Ответ

1 голос
/ 19 августа 2011

У вас есть EntityManager.getTransaction (). Begin () для запуска транзакции, а затем rollback () для ее отката.Или, может быть, вы можете создать отдельный скопированный экземпляр всей базы данных только для тестирования?Просто идея.

...