Модульный тест проходит, если помечено @Transactional, но не проходит, если нет - PullRequest
2 голосов
/ 26 марта 2012

Настройте тест JUNIT таким образом:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/applicationContext.xml", "/applicationContext-security.xml" })
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class BlahIntegrationTests{

 @Test
 public void testMappingsOfHugeObjectGraph(){
 }
}

Я пытаюсь проверить правильность моих отображений гибернации (на основе аннотаций и на основе JPA), и при запуске, как указано выше, мои тестовые прохождения (просто утверждают)что идентификатор создан).

Если я заберу @Transactional, я получу ошибки с некоторыми из моих отношений, которые я ожидал.У кого-нибудь есть мысли о том, почему он не выходит из строя, когда он @Transactional?

. РЕДАКТИРОВАТЬ: Чтобы уточнить, было выброшено исключение в отношении плохих отображений спящего режима (это очень большая структура объектов, и некоторые из них я создал)при сохранении объекта

Ответы [ 2 ]

5 голосов
/ 27 марта 2012

Если вы удалите @Transactional, ваша тестовая БД не будет пустой для другого теста и, следовательно, тесты не будут изолированы.

Если он у вас есть, некоторые тесты могут пройти, даже если они не пройдут (как вы описали, или другой пример, если вы вставляете сущность, которая дублирует какое-то уникальное ограничение).

Решение состоит в том, чтобы вместо @Transactional вставлять

@PersistenceContext
private EntityManager em;

и выполнять перед вами следующие действия.извлечь ваши данные из базы данных

em.flush();
em.clear();

Первая строка вызовет синхронизацию между сеансом и базой данных (ваш провайдер обычно ожидает до конца транзакции).Во второй строке удаляются все сущности из сеанса, поэтому все запросы поступают в базу данных.

А после теста все все еще откатывается, поэтому ваша база данных находится в исходном состоянии.

Надеюсь, что это такпомогает.

0 голосов
/ 26 марта 2012

Если вы уберете @Transactional, фабрика Hibernate будет работать в своем эквиваленте в режиме автоматической фиксации, где каждый новый доступ, который вы делаете, генерирует целую новую сессию. Поэтому, как только вы извлекли объект, он сразу же больше не ассоциируется с открытым сеансом и не подходит для отложенной загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...