Я начал изучать возможности использования OpenEJB во встроенном режиме для модульного тестирования моих компонентов EJB3.Сначала я получил ошибки, подобные приведенному ниже выводу
Testsuite: HelloBeanTest
Tests run: 4, Failures: 0, Errors: 4, Time elapsed: 1,779 sec
------------- Standard Output ---------------
Apache OpenEJB 3.1.4 build: 20101112-03:32
http://openejb.apache.org/
------------- ---------------- ---------------
------------- Standard Error -----------------
log4j:WARN No appenders could be found for logger
(org.apache.openejb.resource.activemq.ActiveMQResourceAdapter).
log4j:WARN Please initialize the log4j system properly.
------------- ---------------- ---------------
Testcase: sum took 1,758 sec
Caused an ERROR
Name "HelloBeanLocal" not found.
javax.naming.NameNotFoundException: Name "HelloBeanLocal" not found.
at org.apache.openejb.core.ivm.naming.IvmContext.federate(IvmContext.java:193)
at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:150)
at
org.apache.openejb.core.ivm.naming.ContextWrapper.lookup(ContextWrapper.java:115)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at HelloBeanTest.bootContainer(Unknown Source)
# ... output is the same for all the rest of the tests
Свойство openejb.home устанавливается как системное свойство и указывает на мой каталог установки OpenEJB.
HelloBeanTest # bootContainer() - это метод setUp, который не выполняется при поиске JNDI.Показано ниже.
@Before
public void bootContainer() throws Exception{
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.LocalInitialContextFactory");
Context context = new InitialContext(props);
hello = (Hello) context.lookup("HelloBeanLocal");
}
После борьбы с подобными проблемами я начал опробовать OpenEJB в не встроенном режиме, запустил контейнер из его установочного каталога и развернул компоненты как ejb.jar.Развертывание прошло успешно, и я начал создавать отдельный Java-клиент.Автономный клиент Java все еще не завершен, но между тем я вернулся к тестированию во встроенном режиме.
К моему удивлению, тесты внезапно начали проходить.Я добавил некоторые дополнительные функции в компонент и тесты для них.Все работало просто отлично.Ниже приведен вывод для этого прогона.
Testsuite: HelloBeanTest
Tests run: 4, Failures: 0, Errors: 0, Time elapsed: 2,281 sec
------------- Standard Output ---------------
Apache OpenEJB 3.1.4 build: 20101112-03:32
http://openejb.apache.org/
------------- ---------------- ---------------
------------- Standard Error -----------------
log4j:WARN No appenders could be found for logger
(org.apache.openejb.resource.activemq.ActiveMQResourceAdapter).
log4j:WARN Please initialize the log4j system properly.
------------- ---------------- ---------------
Testcase: sum took 2,263 sec
Testcase: hello took 0,001 sec
Testcase: sum2 took 0 sec
Testcase: avg took 0,001 sec
Я радостно кодировал и тестировал, пока он снова не сломался.Похоже, что удаление ejb.jar из каталога / apps вызвало это.Таким образом, кажется, что OpenEJB выполняет поиск JNDI еще из установочного каталога, но использует текущий каталог для поиска реальных реализаций при работе во встроенном режиме.Я сделал этот вывод, поскольку ejb.jar, развернутый в apps / dir, не имеет всех методов, которые есть в локальной версии.(Я дважды проверил с помощью javap.) Только сигнатура класса одинакова.
После этого очень длинного вступления пришло время вопросов.
- Может ли кто-нибудь дать какое-либо объяснение этому поведению?
- Упаковка и развертывание EJB-компонентов в apps / dir перед тестированием - простая задача, но могу ли я быть уверен, что даже тогда я тестирую правильную реализацию?
- Есть ли что-то, что можно сделатьсо свойством openejb.home, указывающим на каталог установки OpenEJB?
Для краткости, версия OpenEJB равна Apache OpenEJB 3.1.4 build: 20101112-03: 32 , которая виднав лог выводится также.
Заранее спасибо.