2016-03-08 3 views
0

У меня возникла проблема, когда я пытаюсь создать тест Cucumber/Arquillian для новой службы, которая выполняет пакетное обновление с помощью JPQL. Кажется, что все работает правильно, за исключением моего кода @Then, подтверждающего изменение.Нелогичные результаты теста Cucumer/Arquillian с H2

Я настраиваю свои тестовые данные в своем файле свойств и добавляется в базу данных H2, которая создается в памяти для каждого теста. При запуске пакетного обновления он возвращает ожидаемое количество обновлений на основе этих данных. Но когда я извлекаю один из объектов, которые должны были быть обновлены, данные об этом объекте не изменяются.

Обратите внимание: когда я выполняю вызов службы в своем приложении против нашей базы данных Oracle, он работает правильно, и таблица обновляется, как ожидалось. Проблема, похоже, связана с кэшированием в базе данных H2 в памяти.

Мой источник данных, который развертывается в JBoss на Arquillian является:

<datasource enabled="true" 
      jndi-name="jdbc/arquillian" 
      pool-name="ArquillianEmbeddedH2Pool"> 
    <connection-url> 
     jdbc:h2:mem:arquillian;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS TEST_DB 
    </connection-url> 
    <driver>h2</driver> 
</datasource> 

Мой Огурцы тест определяет @PersistenceContext(unitName = "localH2-testDB")

Мой persistence.xml содержит:

<persistence-unit name="localH2-testDB"> 
    <jta-data-source>jdbc/arquillian</jta-data-source> 
    <properties> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop" /> 
     <property name="hibernate.cache.use_second_level_cache" value="false"/> 
     <property name="hibernate.cache.use_query_cache" value="false"/> 
    </properties> 
</persistence-unit> 

Я не знаю, что другие настройки для базы данных H2 я могу изменить, чтобы попытаться устранить любое кэширование.

ответ

0

Оказалось, что проблема связана с тем, как пакетные обновления обрабатываются в JPA. Они НЕ обновляют кеш постоянной памяти, как можно было бы ожидать. Таким образом, таблицы были обновлены правильно, но когда объект был повторно запрошен, у него не было обновлений. Вот почему мой тест был неудачным (все было внутри одной транзакции), и мой развернутый код работал (отдельные транзакции выполняли обновление и повторно запрашивали данные).

 Смежные вопросы

  • Нет связанных вопросов^_^