Я пытаюсь использовать 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, разве не должно быть простого решения для этого?