Интеграционный тест JPA DAO не выдает исключение при сохранении дублированного объекта? - PullRequest
0 голосов
/ 14 июня 2010

Я нахожусь в процессе модульного тестирования DAO, созданной с использованием Spring / JPA и Hibernate в качестве поставщика.

Перед запуском теста DBUnit вставил запись пользователя с именем пользователя "poweruser" - имя пользователяпервичный ключ в таблице пользователей.Вот метод интеграционного теста:

@Test
@ExpectedException(EntityExistsException.class)
public void save_UserTestDataSaveUserWithPreExistingId_EntityExistsException() {
    User newUser = new UserImpl("poweruser");

    newUser.setEmail("kuser@null.com");
    newUser.setFirstName("New");
    newUser.setLastName("User");
    newUser.setPassword("secret");

    dao.persist(newUser);
}

Я проверил, что запись находится в базе данных в начале этого метода.Не уверен, что это уместно, но если я сделаю dao.flush() в конце этого метода, я получу следующее исключение:

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: 
    Could not execute JDBC batch update

Ответы [ 2 ]

1 голос
/ 15 июня 2010

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

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

1 голос
/ 15 июня 2010

Очевидно, если flush не вызывается явно или неявно (через запрос или коммит), то любое потенциальное исключение не будет выброшено. Поэтому я предполагаю, что мне придется вызывать flush () во всех моих интеграционных тестах, которые изменяют данные.

...