Как определить тестовый источник данных для встроенного EJB-контейнера
Я пытаюсь проверить свои EJB-компоненты, используя встроенный EJB-контейнер. В производстве я использую источник данных JTA, настроенный на сервере приложений. Однако во время тестирования я хочу подключиться к другой БД (в памяти Derby).
Проблема в том, что я не могу понять, как сказать EJB-контейнеру переопределить источник данных JTA, определенный в моем производственном файле persistence.xml (в src/main/resources/META-INF) при подключении к моей базе данных derby в памяти. Источник данных JTA определяется в файле persistence.xml следующим образом:
<jta-data-source>jdbc/myDS</jta-data-source>
Попытка 1: использование теста persistence.xml
Я попытался создать тестовый файл persistence.xml (в src/test/resources/META-INF), который определяет:
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:myDataBase;create=true;" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="password" />
Это спорный вопрос, хотя, потому что, когда я указываю контейнер EJB использовать модуль испытуемый с
Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/classes/") });
ec = EJBContainer.createEJBContainer(properties);
Контейнер просто использует основной файл persistence.xml вместо моего тестового.
Попытка 2: объединение основного и тестового классов в один разнесенный модуль
Единственный способ заставить этот подход работать, это использовать описанный здесь подход - скопировать классы для тестируемого модуля в отдельное место (например, target/ejb-testing-classes), а затем скопировать тест persistence.xml файл поверх, затем укажите это новое местоположение для контейнера EJB:
Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/ejb-testing-classes/") });
ec = EJBContainer.createEJBContainer(properties);
Но это кажется излишне неуклюжим. Это может также стать проблемой в будущем, если я попытаюсь развернуть предварительно упакованные модули (то есть зависимости) в контейнере, поскольку мне нужно будет разбить банки перед слиянием.
My Wish: свойства переопределения источника данных для контейнера EJB
Я думал, что могут быть дополнительные свойства, которые могут быть переданы в контейнер EJB, но пока я могу найти только свойства, подходящие для openEJB или веб-сферы. Я использую встроенный Glassfish для предоставления своего встроенного EJB-контейнера, поскольку это целевая платформа. (Я сейчас нашел свойство glassfish - см. Обновление № 1 ниже)
Несомненно, все, кто пытался протестировать EJB-компоненты со встроенным EJB-контейнером и источником данных, отличным от рабочего БД, сталкивались с этой проблемой. Даже этот парень просто сдался в этот момент и использовал встроенную БД по умолчанию, что для меня не вариант.
Любая помощь приветствуется.
Обновление 1: я нашел список свойств, которые принимает контейнер Glassfish EJB, и сначала кажется, что я мог бы использовать следующее свойство
org.glassfish.ejb.embedded.glassfish.configuration.file
определить источник данных в domain.xml и указать на него контейнер. Однако, согласно исходному коду, это свойство игнорируется, если только не установлено свойство install.root - и это будет означать, что для запуска моих тестов необходима уже существующая установка glassfish. Это недопустимо снизит мобильность моего проекта Maven. :(
Обновление 2: я создал проблему JIRA для этой проблемы и рекомендовал ввести свойства для контейнера EJB glassfish, который позволяет конфигурировать источник данных JTA.
2 ответа
Не может быть сделано со встроенным Glassfish.
Как я заметил в обновлении 1, чтобы настроить встроенный контейнер EJB с источником данных, вы должны:
- настроить файл domain.xml с новым источником данных
- настроить встроенный EJB-контейнер для использования существующей установки Glassfish AS
- настройте встроенный EJB-контейнер для использования файла domain.xml из шага 1.
Итак (благодаря шагу 2) до свидания, мобильность. Но это "решение", с которым мне придется столкнуться, пока разработчики Glassfish не ответят на мой запрос по настройке источников данных через свойство (см. Ссылку JIRA выше в этом вопросе).
Для моих вещей, это работает довольно хорошо, если не использовать встроенный контейнер напрямую, а использовать для этого проект Arquillian. При использовании помощника ShrinkWrap я могу сказать пройти тест persistence.xml (как и другие заменители).
Это показывает довольно короткий пример: https://community.jboss.org/thread/198239
HTH, Тимо