#java #unit-testing #spring #testing #junit
#java #модульное тестирование #spring #тестирование #junit
Вопрос:
Я прокомментировал свои тестовые классы следующим образом:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:WebContent/WEB-INF/applicationContext.xml", "file:WebContent/WEB-INF/context-aspects.xml"})
@Transactional
public class MyTest {
}
Однако при выполнении тестов тестовая база данных внезапно заполняется значениями, хотя @Transactional включен, и я могу прочитать следующее в журнале:
INFO: Began transaction (4): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@669aa3f3]; rollback [true]
07.04.2011 23:57:33 org.springframework.test.context.transaction.TransactionalTestExecutionListener endTransaction
INFO: Rolled back transaction after test execution for test context ...
Есть идеи, почему фактический откат после тестового примера не выполняется?
Обновление: Если я использую HSQLDB, у меня нет этих проблем — так это проблема mysql?
Комментарии:
1. Какой компонент database engine вы используете?
2. В случае MySQL, какой тип вы используете: MyISAM или InnoDB?
3. Я использую MySQL InnoDB. В другом проекте он работает с той же базой данных, но я не могу выяснить, в чем различия в конфигурациях.
Ответ №1:
Обновление: если я использую HSQLDB, у меня нет этих проблем — так это проблема mysql?
Да, вы правы.
Убедитесь, что вы используете правильный диалект (при использовании Hibernate: org.hibernate.dialect.MySQL5InnoDBDialect), и, возможно, вам следует отслеживать инструкции, которые были отправлены в базу данных.
Ответ №2:
Я смог, наконец, решить проблему. Hibernate генерировал таблицы MyISAM, которые, по-видимому, не поддерживают транзакции. Это произошло из-за неправильно настроенного диалекта гибернации. Я использовал org.hibernate.dialect.MySQL5Dialect, но org.hibernate.dialect.Требуется MySQL5InnoDBDialect.