4

请注意,我非常密切地反映了此处给出的示例。

事实上,我的情况稍微简单一些,因为此时我什至没有使用持久性单元进行测试。我的测试项目提供了一个简单的 MDB 和一个会话 bean;MDB 和会话 bean 都正常加载,并且可以在不注入的情况下成功测试(以受约束的方式)。

在我的单元测试中建议的带有注释的注入@LocalClient失败并出现已知错误:

javax.naming.NamingException: Unable to find injection meta-data for [your-class]. Ensure that class was annotated with @org.apache.openejb.api.LocalClient and was successfully discovered and deployed. See http://openejb.apache.org/3.0/local-client-injection.html

当我访问此页面时,它通知我可能需要在我的测试用例上下文设置中添加一个额外的属性。所以现在看起来像:

@Override
public void setUp() throws Exception {
    initializeContext();
}
public void initializeContext() {
    Properties p = new Properties();
    p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
    // the property i've added
    p.put("openejb.tempclassloader.skip", "annotations");

    try {
        InitialContext initialContext = new InitialContext(p);
        initialContext.bind("inject", this);
    } catch (Throwable throwable) { 
        throwable.printStackTrace();
        throw new RuntimeException(throwable);
    }
}

但它仍然失败。我真的很喜欢这个成语,如果我能在我的项目中成功使用它,我会非常兴奋。

其他一些注意事项:

  • 我按照 Apache 的建议提供了一个“空”ejb-jar.xml(在 src/main/resources 中)和一个 application-client.xml(在 src/test/resources 中)告诉 OpenEJB 扫描类路径 [更新:如事实证明,我做错了。请参阅下面的答案,了解对我有用的建议。]
  • OpenEJB 引擎没有将带有注释的测试用例@LocalClient识别为实际被正确提取和处理(例如,我的 MDB 就是这样)

提前感谢您的任何帮助或指导。

4

2 回答 2

7

这个问题可能是由于描述符的位置不正确造成的,这些描述符提示 OpenEJB 哪些类型的模块可用。

为确保正确获取测试类,请确保放置一个名为application-client.xmlat的文件src/test/resources/META-INF,其内容如下:

<application-client/>

这应该强制 OpenEJB 扫描并响应@LocalClient注释的存在。

于 2011-06-06T17:56:48.247 回答
0

当我尝试在名为tomee-embedded-trial的测试项目中测试东西时,我遇到了类似的问题,结果发现 openejb 忽略了名为 tomee-.* 的东西。

我通过指定以下系统属性为我修复了它: openejb.deployments.classpath.include=".*-trial.*" openejb.deployments.package.include=".*-trial.*"

于 2014-05-22T11:29:49.957 回答