Хорошо, извините, я часами искал ответы на этот вопрос, но мне потребовалось ввести весь вопрос для StackOverflow, чтобы всплыть ссылка, которую я искал. Вы можете прочитать много актуальной информации здесь .
У меня есть проект Spring, созданный с помощью Spring Roo для использования Hibernate и MySQL. Однако для тестирования я хочу использовать HSQLDB в памяти, потому что тесты интеграции Roo удаляют данные с идентификаторами (первичными ключами )от 0 до 10 (, а не удаляют данные, используя идентификаторы, назначенные базой данных для данных, которые они уже created), что означает, что он удаляет данные, которые уже находятся в базе данных, что в моем случае вызывает нарушение ограничения, прежде чем он успеет откатить транзакцию.
Это немного сложнее, потому что я полностью переключаю поставщиков баз данных, что означает разные диалекты Hibernate, а также разные настройки DDL (, которые проверяются в производственной среде, создаются-отбрасываются в тесте). Но это не работает, как я ожидаю, и я не понимаю, почему.
Если вы знаете, почему это не работает, скажите об этом, даже если у вас нет решения.
Поскольку это проект Roo, я, конечно, использую Maven. Итак, первое, что я попробовал, это иметь тестовый-специфический src/test/resources/META-INF/persistence.xml
файл, а также тестовый-специфический файл src/test/resources/META-INF/spring/database.properties
. Это не сработало, так как когда я запустил mvn test
, все сломалось с соответствующим сообщением
Conflicting persistence unit definitions for name 'persistenceUnit'
Почему mvn test
все еще собирал не-тестовые ресурсы?
Затем я переименовал src/test/resources/META-INF/spring
в spring-test
и скопировал в него applicationContext.xml
. Я изменил конфигурацию контекста в тестовых классах на
@ContextConfiguration(locations = "classpath:/META-INF/spring-test/applicationContext*.xml")
Завершение (или так я думал )разделение,Я внес пару правок вspring-test/applicationContext.xml
:
Изменил путь к файлам свойств:
на
Изменил имя единицы сохраняемости:
на
И сделал соответствующее изменение в имени единицы сохраняемости наsrc/test/resources/META-INF/persistence.xml
Хорошо, теперь конфликта нет, но Hibernate каким-то образом потерял сопоставления сущностей (, например для сущности Product
), и я получаю :
org.springframework.dao.InvalidDataAccessApiUsageException:
org.hibernate.hql.ast.QuerySyntaxException: Product is not mapped [SELECT o FROM Product o];
. Почему Spring/Hibernate потерял сопоставления сущностей в этой конфигурации?
Итак, следующее, что я попробовал, — это объединить два файла persistence.xml
, чтобы один файл под src/main/resources/META-INF
включал обе единицы персистентности.
Это работает!!??
Я думаю, что это уродливо, потому что теперь у меня есть тестовая конфигурация в моем производственном коде, но это то, с чем я справляюсь.
Как лучше?
Насколько я понимаю, свойства недоступны в файле persistence.xml так, как они доступны в XML-файлах Spring. Так что я не думаю, что смогу делать то, что хочу, только с тестовым-файлом свойств.
В идеале я бы запускал тесты, используя всю конфигурацию из src/main/resources, за исключением того, что специально переопределено в src/test/resources. Есть ли способ сделать это?
Спасибо за любую информацию, которую вы можете предоставить!