Unit testing 在嵌入式模式下使用OpenEJB进行单元测试的困惑

Unit testing 在嵌入式模式下使用OpenEJB进行单元测试的困惑,unit-testing,ejb,jndi,openejb,Unit Testing,Ejb,Jndi,Openejb,我开始探索在嵌入式模式下使用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.ap

我开始探索在嵌入式模式下使用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()是一个安装方法,在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仔细检查了一下)只有类签名是相同的

经过长时间的介绍,现在是提问时间

  • 有人能解释这种行为吗
  • 在测试之前在apps/dir中打包和部署ejb是一项简单的任务,但我是否可以确保即使这样我也在测试正确的实现
  • 这些都与指向openejb安装目录的openejb.home属性有关吗
总之,OpenEJB版本是ApacheOpenEJB 3.1.4版本:20101112-03:32,也可以在日志输出中看到


提前感谢。

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

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

要使用OpenEJB embedded,您不需要任何配置文件、目录或端口。您只需在项目的类路径中包含LIB


我要说的第一件事就是检查一下。可能有二十多个示例项目都是用Ant和Maven构建脚本设置的。只要OpenEJB库位于类路径中,所有示例都可以在任何环境中工作。下面是一段视频,介绍如何使用其中一个示例来演示。我建议将
简单无状态
示例作为最佳起点。

好的,我让它工作了,或者看起来是这样。我进行了配置,以便仅将openejb.configuration系统属性设置为指向openejb.xml配置文件,在该文件中定义查找bean的位置。测试通过,输出在报告中给出,openejb.home属性指向我的项目目录“如果使用OpenEJB本地服务器,则实际上是将OpenEJB用作嵌入式库。这意味着当应用程序启动时,OpenEJB也将在虚拟机中启动。很可能您不希望在安装OpenEJB的目录中执行应用程序,而是希望在开发应用程序的目录中执行应用程序。这很好,但是您需要告诉OpenEJB它是在哪里安装的。为此,请设置“openejb.home”系统变量。“困惑?谢谢你的链接,这是一个孤立的页面,非常过时。现在,它包括的内容。请在没有任何
openejb.configuration
openejb.home
设置的情况下尝试。它可以与这些一起工作,但不会有多大乐趣。指向指向指向应用程序目录的配置文件有点脆弱。测试中的文件路径可能有问题。OpenEJB能够仅使用类路径本身来查找应用程序,并且可以创建任何需要的容器,而无需配置。太棒了!我让它工作了。经过一些调查,我发现当从类路径加载包含ejb的jar时,其内部必须有(空的)META-INF/ejb-jar.xml文件。当通过配置文件的部署目录加载EJB JAR时,这是不必要的。OpenEJB文档确实提到了这一事实。感谢您的回复和评论。继续使用OpenEJB(尤其是嵌入式模式)!