Как настроить тесты JUnit для Glassfish Embeddable EJBContainer + EclipseLink JPA?

Я пытаюсь использовать EJB 3.1 Embeddable EJBContainer на Glassfish 3.1 для интеграционного тестирования моих EJB. Есть проблема с загрузкой классов, которую я не могу понять.

Мои ejb встроены в dum-ejb.jar. Они используют EclipseLink JPA. Я также создаю банку клиента EJB dum-ejb-client.jar, пытаясь решить проблемы с загрузкой классов. Клиентский jar содержит интерфейсы EJB и классы Entity (которые обычно являются параметрами или возвращают значения). Клиентская банка также содержит много ненужных классов, которые можно было бы удалить (но я не понимаю, как это решит проблему).

Проблема в том, что, поскольку EclipseLink выполняет переплетение байт-кода с классами Entity, классы Entity не должны находиться в пути к классам при выполнении тестов junit: http://www.java.net/forum/topic/glassfish/glassfish/embedded-glassfish-and-weaving

Я могу сделать это и настроить путь к классам, чтобы dum-ejb.jar не был включен. Если я использую EJBContainer, чтобы найти свой сервис как java.lang.Object и вызвать его методы через отражение, тест работает. Но, конечно, я не хочу писать тесты так.

Типичный тест будет выглядеть так:

@Test
   public void testInEJBContainer() throws Exception {

       File ejbJarFile = new File("target/dum/dum-ejb.jar");

       Map props = new HashMap();
       props.put("org.glassfish.ejb.embedded.glassfish.instance.root",
               "target/classes/instance-root");
       props.put(EJBContainer.MODULES, new File[]{ejbJarFile});
       EJBContainer container = EJBContainer.createEJBContainer(props);

       CompanyService = (CompanyService)
container.getContext().lookup("java:global/dum/CompanyServiceImpl");
       log.info("result of findAll() " + service.findAll(false));
   }

Как я могу запустить тест, если интерфейс CompanyService и возвращаемые классы Company Entity не могут быть в пути к классам?

Даже если dum-ejb.jar не находится в пути к классам, а dum-ejb-client.jar есть, плетение EclipseLink нарушается.

Разве это не типичный вариант использования EJBContainer, разве не должно быть простого решения для этого?


person user449236    schedule 12.04.2011    source источник


Ответы (1)


Оказывается, я столкнулся с проблемами загрузки классов, так как запускал EJBContainer из проекта maven ear.

Когда я запускаю его из самого проекта maven ejb, таких проблем нет, и EJBContainer прост в использовании.

person user449236    schedule 21.04.2011