Я хочу протестировать метод save () сеанса гибернации, используя среду тестирования Spring. @Test метод:
@Test
@Transactional
public void testSave() {
User expected = createUser();
getGenericDao().currentSession().save(expected);
User actual = getUser(generatedId);
assertUsersEqual(expected,actual);
}
Я хочу сбросить пользователя в базу данных. Я хочу, чтобы мой пользователь был в базе данных после этого метода
getGenericDao().currentSession().save(expected);
Затем я хочу перейти в базу данных, используя структуру данных Spring, и получить этого сохраненного пользователя следующей строкой:
User actual = getUser(generatedId);
Я попытался использовать метод очистки гибернации, например:
currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();
Он не сбрасывает моего пользователя в базу данных! Однако, если я не использую аннотацию @Transactional spring и сохраню своего пользователя в программной весенней транзакции, я достигну того, чего хочу. К сожалению, пользователь, сохраненный в db, не откатывается, поскольку нет spring @Transactional. Поэтому мой метод тестирования изменяет базу данных и поведение последующих методов тестирования.
Поэтому мне нужно сбросить моего пользователя в db внутри метода тестирования (не в конце), а в конце метода тестирования откатить все изменения в db.
ОБНОВЛЕНИЕ предлагает подготовить следующий метод:
@Transactional
public void doSave(User user){
getGenericDao().currentSession().save(user);
}
И вызов doSave внутри testSave ничего не делает. По-прежнему у меня нет пользователя в базе данных после выполнения этого метода. Я устанавливаю точку останова и проверяю свою базу данных из командной строки.
ОБНОВЛЕНИЕ Большое спасибо за ответ. Проблема в том, что метод flush () не помещает моего пользователя в базу данных. Я пробовал Isolation.READ_UNCOMMITTED, и он не помещает моего пользователя в базу данных. Я могу добиться того, чего хочу, но только если я отключу весеннюю транзакцию в методе @Test и сохраню в программной транзакции. НО тогда метод @Test не откатывается, оставляя сохраненного пользователя для последующих методов @Test. Здесь метод @Test для сохранения пользователя не так опасен, как метод @Test для удаления пользователя, потому что он не откатывается. Таким образом, должна быть предусмотрена поддержка транзакций для метода @Test, с помощью которого я все равно не могу поместить своего пользователя (или удалить) в db. Фактически пользователь помещается (или удаляется) в базу данных только после завершения метода @Test и завершения транзакции для метода @Test. Итак, я хочу сохранить своего пользователя в базе данных в середине метода @Test и откатить его в конце метода @Test
Спасибо!