2011-09-14 34 views
2

我开始探索在嵌入模式下使用OpenEJB来对我的EJB3组件进行单元测试的可能性。起初,我得到了像下面的输出关于在嵌入模式下使用OpenEJB进行单元测试的困惑

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.home属性指向OpenEJB安装目录有关?

对于总结,OpenEJB的版本是的Apache OpenEJB的3.1.4版本:20101112-03:32,这是可见在日志输入输出。

在此先感谢。

回答

1

它的确与设置openejb.home指向安装目录有关。

有一个conf/openejb.xml文件,其中apps/可能被列为部署所在的位置。所有日志输出都转到logs/目录,而不是在测试用例的System.out中,您可以轻松读取它。

要使用嵌入式OpenEJB,您不需要任何配置文件,目录或端口。您只需将这些库包含在项目的类路径中。

我要说的第一件事就是检查openejb-examples-3.1.4.zip。可能有二十多个示例项目都使用Ant和Maven构建脚本进行设置。只要OpenEJB库位于类路径中,所有示例都可以在任何环境中使用。这是一个使用unit test in Eclipse的例子之一的视频。我建议将simple-stateless作为最佳起点。

+0

好吧,我得到它的工作,或似乎。我进行了配置,以便仅将openejb.configuration系统属性设置为指向一个openejb.xml配置文件,我在其中定义在哪里查找bean。测试通过,输出在报告中给出,并且openejb.home属性指向我的项目目录。 – kaskelotti

+0

然后再打开文件[OpenEJB的网站说(http://openejb.apache.org/embedding-openejb.html) _“如果你使用OpenEJB的本地服务器,你实际上是使用作为OpenEJB的嵌入式库。这意味着当您的应用程序启动时,OpenEJB也将在您的虚拟机中启动。您可能不希望在安装了OpenEJB的目录中执行您的应用程序,但希望在您开发应用程序的位置执行它。很好,但你需要告诉OpenEJB它的安装位置,为此,设置“openejb.home”系统变量。“_ 混淆? – kaskelotti

+1

感谢您的链接,它是一个孤儿页面,非常过时。它现在包含[本页]的内容(http://openejb.apache.org/local-server.html)。请尝试不使用任何'openejb.configuration'或'openejb.home'设置。它可以与这些工作,但它不会很有趣。指向指向应用程序目录的配置文件有点脆弱。测试中的文件路径可能有问题。 OpenEJB能够使用类路径本身来查找应用程序,并将创建任何所需的容器,而不需要配置。 –