Как определить тестовый источник данных для встроенного контейнера EJB

Я пытаюсь проверить свои EJB, используя встроенный контейнер EJB. В производстве я полагаюсь на источник данных JTA, настроенный на сервере приложений. Однако во время тестирования я хочу подключиться к другой БД (в памяти Derby).

Проблема в том, что я не могу понять, как сообщить контейнеру EJB переопределить источник данных JTA, определенный в моем файле persistence.xml (в файле src/main/resources/META-INF) с подключением к моей базе данных derby DB. Источник данных JTA определен в файле persistence.xml следующим образом:

```
jdbc/myDS

```

Попытка 1: использование теста persistence.xml
----------------------------------------------

Я попытался создать тестовый файл persistence.xml (в src/test/resources/META-INF), который определяет:

```

 

```

Это вызывает беспокойство, потому что, когда я указываю контейнер EJB для использования тестируемого модуля с

```
Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/classes/") });
ec = EJBContainer.createEJBContainer(properties);

```

контейнер просто использует основной файл persistence.xml вместо моего тестового.

Попытка 2: Объединение основных и тестовых классов в один модуль с разнесением
------------------------------------------------------------------------------

Единственный способ, с помощью которого я могу сделать этот подход, - это использовать описанный подход  [здесь](https://pschyska.blogspot.com.au/2011/06/unit-testing-ejb-31-with-netbeans- maven.html )  - скопировать классы для тестируемого модуля в отдельное место (например, target/ejb-testing-classes), а затем скопировать файл test 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
-----------------------------------------------------------

I thought there might be additional properties that could be passed into the EJB container, but so far I can only find properties appropriate for [openEJB](https://tomee.apache.org/configuring-datasources-in-tests.html) or [websphere](https://pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/rejb_emconproperties.html). I am using embedded Glassfish to provide my embedded EJB container as that is the target platform. *(I have now found the glassfish property - see Update #1, below)*

Несомненно, все, кто пробовал тестировать EJB со встроенным контейнером EJB и источником данных, отличным от данных в производственной БД, столкнулись с этой проблемой. Даже  [этот парень](https://stackoverflow.com/a/3939617/378606)  просто отказался от этого момента и использовал встроенную базу данных по умолчанию, которая для меня не является вариантом.

Любая помощь приветствуется.

***Update 1:*** *I have found the [list of properties](https://docs.oracle.com/cd/E18930_01/html/821-2424/gjlde.html#gksnv) that the Glassfish EJB container accepts, and at first it appears that I could use the following property*

```
org.glassfish.ejb.embedded.glassfish.configuration.file

```

*, чтобы определить источник данных в domain.xml и указать на него контейнер. Однако, согласно  [исходный код](http://grepcode.com/file/repo1.maven.org/maven2/org.glassfish.ejb/ejb-container/3.1.1/org/glassfish/ejb/embedded/ EJBContainerProviderImpl.java # EJBContainerProviderImpl.getLocations% 28java.util.Map% 29 ) , это свойство игнорируется, если не установлено свойство installation.root, и это будет означать необходимость предварительно существующая установка стеклянной рыбы, чтобы запустить мои тесты. Это неприемлемо снизило бы переносимость моего проекта Maven. : (*

***Update 2:*** *I have create a [JIRA issue](https://java.net/jira/browse/GLASSFISH-19654) for this problem and recommended that properties be introduced for the glassfish EJB container which allows configuration of a JTA datasource.*

Не может быть сделано со встроенной Glassfish.

Как я заметил в обновлении 1, чтобы сконфигурировать встроенный контейнер EJB с источником данных, вы должны:

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

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



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

This shows a quite short example: <https://community.jboss.org/thread/198239>

НТН,
Timo