#java #jakarta-ee #dependency-injection #integration-testing #openejb
#java #джакарта-ee #внедрение зависимости #интеграция-тестирование #openejb
Вопрос:
Обратите внимание, что я очень точно повторяю приведенный здесь пример.
На самом деле, моя ситуация несколько проще, поскольку на данный момент я даже не тестирую с помощью модуля сохранения. Мой тестовый проект предоставляет простой MDB и сессионный компонент; и MDB, и сессионный компонент загружаются в обычном режиме и могут быть успешно протестированы (ограниченным образом) без внедрения.
Предложенное внедрение с @LocalClient
аннотацией в моих модульных тестах завершается ошибкой с известной ошибкой:
javax.naming.NamingException: Unable to find injection meta-data for [your-class]. Ensure that class was annotated with @org.apache.openejb.api.LocalClient and was successfully discovered and deployed. See http://openejb.apache.org/3.0/local-client-injection.html
Когда я захожу на эту страницу, она сообщает мне, что мне, возможно, потребуется добавить дополнительное свойство в настройку контекста моего тестового примера. Итак, теперь это выглядит как:
@Override
public void setUp() throws Exception {
initializeContext();
}
public void initializeContext() {
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
// the property i've added
p.put("openejb.tempclassloader.skip", "annotations");
try {
InitialContext initialContext = new InitialContext(p);
initialContext.bind("inject", this);
} catch (Throwable throwable) {
throwable.printStackTrace();
throw new RuntimeException(throwable);
}
}
Но это все еще сбой. Мне действительно нравится эта идиома, и я был бы очень рад, если бы смог успешно использовать ее в своих проектах.
Несколько других замечаний:
- Я предоставляю «пустой» ejb-jar.xml (в src / main /resources) и application-client.xml (в src / test / resources), как было предложено Apache, чтобы сообщить OpenEJB о проверке пути к классу [ОБНОВЛЕНИЕ: как оказалось, я делал это неправильно. Смотрите мой ответ ниже для предложения, которое сработало для меня.]
- Тестовые примеры, аннотированные с помощью
@LocalClient
, не идентифицируются движком OpenEJB как фактически подобранные и обработанные должным образом (как, например, мои MDB)
Заранее спасибо за любую помощь или руководство.
Ответ №1:
Эта проблема, вероятно, вызвана неправильным расположением дескрипторов, которые указывают OpenEJB, какие типы модулей доступны.
Чтобы убедиться, что тестовые классы подобраны правильно, убедитесь, что вы размещаете файл с именем application-client.xml
at src/test/resources/META-INF
со следующим содержимым:
<application-client/>
Это должно заставить OpenEJB сканировать и реагировать на наличие @LocalClient
аннотаций.
Комментарии:
1. Рад, что вы нашли проблему, и дважды благодарю за публикацию ответа. Я отправил JIRA для улучшения, где мы могли бы добавить это в список того, что мы могли бы проверить issues.apache.org/jira/browse/OPENEJB-1570
2. Обратите внимание, что @LocalClient больше не требуется в OpenEJB 4, равно как и какие-либо дескрипторы развертывания. Еще не выпущен, но выглядит действительно хорошо. Нам нужно немного продвинуться в поддержке CDI, а затем запустить бета-версию.
Ответ №2:
У меня была похожая проблема, когда я пытался протестировать материал в тестовом проекте под названием tomee-embedded-trial, и оказалось, что openejb игнорирует материал с именем tomee-.* .
Я исправил это для себя, указав следующие системные свойства: openejb.deployments.classpath.include=".*-trial.*"
openejb.deployments.package.include=".*-trial.*"