Java EE 6 - встроенные тесты EJB контейнера
-
30-09-2019 - |
Вопрос
Этот вопрос считает Java EE 6., с использованием Glassfish v3 встроен-все.
У меня есть единичный тест, который использует EJBContainer для проверки моего EJB без гражданства. Проблема в том, что у меня проблемы с поиском EJB (удаленный) с помощью JNDI:
setup() {
ctx = EJBContainer.createEJBContainer().getContext();
}
...
test() {
BookService bookService = (BookService)ctx.lookup("java:global/BookServiceEJB!com.something.service.BookService");
...
}
@Stateless
public class BookServiceEJB implements BookService {
...
}
@Remote
public interface BookService {
...
}
дает исключение:
javax.naming.NamingException: Lookup failed for 'java:global/BookServiceEJB!com.something.service.BookService' in SerialContext [Root exception is javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found]
...
caused by: javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found
Я попробовал несколько дорожных ресурсов JNDI:
например
java:global/BookServiceEJB
java:global/BookService
четное:
java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB
так далее...
Nothings работает
я не имеют никакого развертывания XML Настроен файлы, только persistence.xml
в мета-инф.
Тест использует Maven Surefire:
mvn clean test
Любая помощь значительно ценится!
Примечание: Полное развертывание сервера Glassfish (используя AppClient, а также @EJB
инъекция)
Решение
После многих поисков нашел решение, которое работает для меня ...
Вам придется настроить EJBContainer с свойством: EJBContainer.modules и местоположение, где классы модуля (при использовании Maven, «Цель / классы»).
например
...
props = new Properties();
props.put(EJBContainer.MODULES, new File("target/classes"));
ec = EJBContainer.createEJBContainer(props);
...
Если ваш EJB использует JPA, есть другая проблема в том, что вы не сможете определить DataSource в встроенном контейнере, поэтому приходится использовать DS по умолчанию: «JDBC / __ default».
Так, например, моя настойчивость .xml выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
version="1.0">
<persistence-unit name="bookshelf" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.blah.domain.Book</class>
<jta-data-source>jdbc/__default</jta-data-source>
<properties>
<property name="eclipselink.logging.level" value="INFO"/>
</properties>
</persistence-unit>
</persistence>
Я не выяснил, как настроить встроенный тест контейнера для использования одного DS (JDBC / __ __ по умолчанию) и мое приложение для использования другого (например, JDBC / Bootsds)
видеть: http://www.mentby.com/glassfish/embedded-testing-woes.html.
видеть: http://forums.java.net/jive/thread.jspa?messageId=395759.
Если честно, я не знаю, почему люди беспокоят Java EE, когда решения, такие как весна, намного проще ...
Это было очень разочаровывающе и много времени потрачено впустую ... Надеюсь, это поможет.
Другие советы
Есть несколько предметов, которые вам нужно проверить, чтобы убедиться, что вы можете загрузить боб через Context.lookup.lookup. избегать а NamingException..
Убедитесь, что у вас есть боб. Это может звучать что-то очевидное, но я провел много времени, пытаясь выяснить, почему я не смог получить пример моего сервиса в тестах. Причина заключалась в том, что я скучал по Бездействие Аннотация.
Добавьте модуль при создании контейнера, как указал @dzhu. Для Maven классы будет цель/классы, для Maven тесты будет цель/тестовые классы.
Что-то не так, если вы найдете сообщение, как
SEVERE: EJB6005:No EJB modules found
в консоли. Это говорит вам, что нет Бездействие Аннотированные классыПосмотрите на встроенную консоль Glassfish! Там вы увидите имена поиска для ваших бобов. Обратите внимание на сообщения в формате
INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]
. Отказ Это означает, что вы можете нажать на боб, либо призываяcontext.lookup("java:global/classes/YourBean!bean.package.YourBean")
или более короткое имяcontext.lookup("java:global/classes/YourBean")
которые могут быть полезны, если нет никаких коллизий.
Надеюсь, это поможет кому-то. Было бы действительно полезно иметь эти советы.
Я написал небольшой учебник по использованию встроенного контейнера GlassFish 3.1, также обращаясь к проблеме для получения другого настойчивости .xml для испытаний. Также фиксирующие контейнер сбои с удаленными интерфейсами и веб-сайтами. Вы можете проверить это в http://pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.html.