Как определить тестовый источник данных для встроенного 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 с источником данных, вы должны:

  1. настроить файл domain.xml с новым источником данных
  2. настроить встроенный EJB-контейнер для использования существующей установки Glassfish AS
  3. настройте встроенный EJB-контейнер для использования файла domain.xml из шага 1.

Итак (благодаря шагу 2) до свидания, мобильность. Но это "решение", с которым мне придется столкнуться, пока разработчики Glassfish не ответят на мой запрос по настройке источников данных через свойство (см. Ссылку JIRA выше в этом вопросе).

Для моих вещей, это работает довольно хорошо, если не использовать встроенный контейнер напрямую, а использовать для этого проект Arquillian. При использовании помощника ShrinkWrap я могу сказать пройти тест persistence.xml (как и другие заменители).

Это показывает довольно короткий пример: https://community.jboss.org/thread/198239

HTH, Тимо

Другие вопросы по тегам