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
إلخ...
لا شيء يعمل
أنا ليس لديك أي نشر XML تم تكوين الملفات ، فقط أ persistence.xml
في meta-inf.
الاختبار يستخدم 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 ، فهناك مشكلة أخرى من حيث أنك لن تتمكن من تحديد مصدر بيانات في الحاوية المدمجة ، لذلك يجب استخدام DS: "JDBC/__ الافتراضي".
على سبيل المثال ، يبدو أن ثباتي. 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/Booksds)
نرى: http://www.mentby.com/glassfish/embedded-testing-woes.html
نرى: http://forums.java.net/jive/thread.jspa؟messageid=395759
لأكون صادقًا ، لا أعرف لماذا يزعج الناس Java ee عندما تكون حلول مثل الربيع أكثر بساطة ...
لقد كان الأمر محبطًا للغاية وأهدر الكثير من الوقت ... أتمنى أن يساعد هذا.
نصائح أخرى
هناك بعض العناصر التي تحتاج إلى التحقق منها للتأكد من أنه يمكنك تحميل الفول من خلال Context.lookup تجنب أ NamingException.
تأكد من أن لديك حبة. قد يبدو هذا شيئًا واضحًا ، لكنني قضيت الكثير من الوقت في محاولة لمعرفة سبب عدم تمكني من الحصول على مثيل لخدمتي في الاختبارات. السبب هو أنني كنت أفتقد عديمة الجنسية حاشية. ملاحظة.
أضف الوحدة النمطية عند إنشاء الحاوية كما أشار dzhu. لمافن الطبقات سوف يكون استهداف/الطبقات, ، ل maven الاختبارات سوف يكون استهداف/فئات الاختبار.
هناك خطأ ما إذا وجدت رسالة مثل
SEVERE: EJB6005:No EJB modules found
في وحدة التحكم. يخبرك أنه لا يوجد عديمة الجنسية الطبقات المشروحةألقِ نظرة على وحدة التحكم في الأسماك الزجاجية المدمجة! في هناك سترى أسماء البحث لفاصوليا. انتبه إلى الرسائل في التنسيق
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