2011-04-25 4 views
2

Я запускаю свои тесты DAO в тестовом классе JUnit с соответствующими @ContextConfiguration и прикрепленными аннотациями @RunWith. Индивидуальные тесты помещают некоторые данные в базу данных и проверяют здравомыслие. После этого ожидается очистка состояния базы данных. Существует простой способ - отметьте методы/класс как @Transactional, затем методы выполняются в транзакции, а откат происходит так, как должен.Транзакционные тесты с Spring @ContextConfiguration - устранение проблем с базой данных

Проблема в том, что этот подход к тестированию DAO не полностью имитирует окружающую среду. Скажем, у меня есть несколько ленивых полей сбора в моей сущности JPA. В моем коде контроллера я получаю этот объект с вызовом myDao.getMyEntity (id) и перебираю ленивую коллекцию. То, что я получаю во время выполнения приложения, - это исключение LazyInitializationException, но это не произойдет в моем тесте, поскольку оно фактически является транзакционным. Как мне запустить тесты, когда тесты не являются @Transactional, но данные все еще очищаются на конце теста?

Я использую in-memory HSQLDB для тестов, если это имеет значение.

ответ

1

Я прочитал это, чтобы начать, http://static.springsource.org/spring/docs/3.0.x/reference/testing.html#testcontext-tx

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

3

Вы не должны использовать @Transactional для своих методов тестирования, я предполагаю, что у вас есть методы уровня обслуживания и/или методы DAO. Используйте @Rollback для своих тестовых методов, чтобы ваша база данных была очищена после выполнения тестов.

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/test/annotation/Rollback.html

Смежные вопросы