我开始探索在嵌入式模式下使用 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 仔细检查过。)只有类签名是相同的。
在这个很长的介绍之后,是提问时间。
- 任何人都可以为这种行为提供任何解释吗?
- 在测试之前在应用程序/目录中打包和部署 EJB 是一项简单的任务,但我能否确定即使这样我也在测试正确的实现?
- 这是否与指向 OpenEJB 安装目录的 openejb.home 属性有关?
总而言之,OpenEJB 版本是Apache OpenEJB 3.1.4 build: 20101112-03:32,在日志输出中也可见。
提前致谢。