我开始探索在嵌入模式下使用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
我很高兴编码和测试,直到再次崩溃。似乎从/ apps目录中删除ejb.jar会导致它。因此,似乎OpenEJB仍然从安装目录执行JNDI查找,但是使用当前目录来查找在嵌入模式下运行时的实际实现。我得出了这个结论,因为部署在apps / dir中的ejb.jar没有本地版本具有的所有方法。 (我用javap仔细检查过。)只有类签名是相同的。
经过这么长时间的介绍,这是问题时间。
总结一下,OpenEJB版本是 Apache OpenEJB 3.1.4 build:20101112-03:32 ,这在日志输出中也是可见的。
提前致谢。
答案 0 :(得分:1)
它确实与将openejb.home
设置为指向安装目录有关。
有一个conf/openejb.xml
文件可能列有apps/
部署的位置。所有日志输出都转到logs/
目录,而不是在测试用例的System.out中,您可以轻松阅读它。
要使用嵌入式OpenEJB,您不需要任何配置文件,目录或端口。您只需在项目的类路径中包含lib。
我要说的第一件事是查看openejb-examples-3.1.4.zip。可能有二十几个示例项目都使用Ant和Maven构建脚本进行设置。只要OpenEJB库位于类路径中,所有示例都可以在任何环境中使用。以下是使用其中一个示例unit test in Eclipse的视频。我建议将simple-stateless
示例作为最佳起点。