【问题标题】:Confusion about using OpenEJB in embedded mode for unit-testing关于在嵌入式模式下使用 OpenEJB 进行单元测试的困惑
【发布时间】:2011-09-14 04:55:40
【问题描述】:

我开始探索在嵌入式模式下使用 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 打包并部署到 apps/ 目录中是一项简单的任务,但我能否确定即使这样我正在测试正确的实现?
  • 这是否都与指向 OpenEJB 安装目录的 openejb.home 属性有关?

总而言之,OpenEJB 版本是 Apache OpenEJB 3.1.4 build: 20101112-03:32,在日志输出中也可见。

提前致谢。

【问题讨论】:

    标签: unit-testing ejb jndi openejb


    【解决方案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 示例作为最佳起点。

    【讨论】:

    • 好的,我让它工作了,或者看起来是这样。我进行了配置,以便仅设置 openejb.configuration 系统属性以指向 openejb.xml 配置文件,在该文件中定义查找 bean 的位置。测试通过,输出在报告中给出,openejb.home 属性指向我的项目目录。
    • 然后是OpenEJB site says 上的文档 "如果您使用 OpenEJB 本地服务器,您实际上是在使用 OpenEJB 作为嵌入式库。这意味着当您的应用程序启动时,OpenEJB 也会启动,在您的虚拟机中。很可能您不想在安装 OpenEJB 的目录中执行您的应用程序,而是希望在您正在开发它的地方执行您的应用程序。这很好,但您需要告诉 OpenEJB 它在哪里已安装。为此,请设置“openejb.home”系统变量。” 混淆?
    • 感谢您的链接,这是一个孤立的页面,非常过时。它现在包含this page 的内容。请尝试不使用任何 openejb.configurationopenejb.home 设置。它可以与那些一起工作,但不会很有趣。指向指向应用程序目录的配置文件有点脆弱。测试中的文件路径可能有问题。 OpenEJB 能够仅使用类路径本身来查找应用程序,并且无需配置即可创建所需的任何容器。
    • 太棒了!我让它工作了。经过一番调查,我发现包含 EJB 的 jar 在从类路径加载时必须有(空的)META-INF/ejb-jar.xml 文件。当通过配置文件的部署目录加载 EJB jar 时,这不是必需的。 OpenEJB 文档确实提到了这个事实。感谢您的回复和cmets。继续使用 OpenEJB(尤其是嵌入式模式)!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2012-12-20
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多