Я пытаюсь проверить свои 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: Объединение основных и тестовых классов в один модуль с разнесением
Единственный способ, с помощью которого я могу сделать этот подход, - это использовать описанный подход здесь - скопировать классы для тестируемого модуля в отдельное место (например, 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 or websphere. 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 и источником данных, отличным от данных в производственной БД, столкнулись с этой проблемой. Даже этот парень просто отказался от этого момента и использовал встроенную базу данных по умолчанию, которая для меня не является вариантом.
Любая помощь приветствуется.
Update 1: I have found the list of properties 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 и указать на него контейнер. Однако, согласно исходный код , это свойство игнорируется, если не установлено свойство installation.root, и это будет означать необходимость предварительно существующая установка стеклянной рыбы, чтобы запустить мои тесты. Это неприемлемо снизило бы переносимость моего проекта Maven. : (
Update 2: I have create a JIRA issue for this problem and recommended that properties be introduced for the glassfish EJB container which allows configuration of a JTA datasource.