Тест интеграции с базой данных Spring, когда сбрасывать или?

Я новичок в весне и делаю некоторые интеграционные тесты. Использование данных Hibernate, MySql и Spring JPA. Я использую поддержку транзакций, и в конце каждого теста все откатывается.

Например:

@Test (expected=DataIntegrityViolationException.class)
public void findAndDelete() {
    UUID uuid = UUID.fromString(TESTID);
    User user= iUserService.findOne(uuid);
    iUserService.delete(cashBox);

    iUserService.flush();                

    assertNull(iUserService.findOne(uuid));
}

В приведенном выше коде я вызываю iUserService.flush(), так что sql отправляется в БД, и возникает ожидаемое исключение DataIntegrityViolationException, потому что есть внешний ключ от пользователя к другой таблице (каскад не разрешен, нет). Пока все хорошо.

Теперь, если я удалю iUserService.flush(), ожидаемое исключение не произойдет, потому что sql не будет отправлен в БД.

Я попытался добавить flush() в метод @After разборки, но это не сработало, поскольку тест не видит исключение вне тестового метода.

Есть ли способ избежать вызова флеша в методах тестирования?

Было бы предпочтительнее, если бы разработчикам в моей команде вообще не приходилось использовать метод сброса в своем тестовом коде.

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

    @Before
public void before() {
    Session session = entityManagerFactory.createEntityManager().unwrap(Session.class);
    session.setFlushMode(FlushMode.ALWAYS);

}

но, похоже, он очищает sqls перед каждым запросом.


person Seamus McMorrow    schedule 08.11.2012    source источник


Ответы (1)


По моему скромному мнению, лучше, чем разработчики вашей команды знают, что они делают.

Он включает в себя то, что настроено по умолчанию, и последствия этого.

Пожалуйста, посмотрите, зачем вам нужен избегайте ложных срабатываний при тестировании кода ORM

person jbbarquero    schedule 09.01.2013