Я пытаюсь использовать EJB 3.1 Embeddable EJBContainer на Glassfish 3.1 для тестирования интеграции моего EJB.Есть проблема с загрузкой классов, которую я не могу понять.
Мои ejbs встроены в dum-ejb.jar.Они используют EclipseLink JPA.Я также создаю EJB-клиент jar dum-ejb-client.jar, пытаясь бороться с проблемами загрузки классов.Клиентский jar содержит интерфейсы EJB и классы сущностей (которые обычно являются параметрами или возвращаемыми значениями).Клиентский jar также содержит множество ненужных классов, которые можно было бы отбросить (но я не понимаю, как это решило бы проблему).
Проблема в том, что, поскольку EclipseLink выполняет переплетение байт-кода с классами Entity, Entityклассы не должны находиться в пути к классам при запуске тестов junit: http://www.java.net/forum/topic/glassfish/glassfish/embedded-glassfish-and-weaving
Я могу сделать это и настроить classpath так, чтобы 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 и возвращенные классы сущностей компании не могут быть в пути к классам?
Даже если dum-ejb.jar не находится на пути к классам, а dum-ejb-client.jar - это, EclipseLink ткачество нарушается.
Разве это не совсем типичный вариант использования EJBContainerразве не должно быть простого решения этого вопроса?