请注意,我非常密切地反射(reflect)了 example given here

事实上,我的情况稍微简单一些,因为此时我什至没有使用持久性单元进行测试。我的测试项目提供了一个简单的 MDB 和一个 session bean; MDB 和 session bean 都正常加载,无需注入(inject)即可成功测试(以受限方式)。

在我的单元测试中使用 @LocalClient 注释的建议注入(inject)失败并出现已知错误:
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
当我访问此页面时,它通知我可能需要向我的测试用例上下文设置添加一个额外的属性。所以现在看起来像:


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 扫描类路径 [更新:事实证明,我做错了。有关对我有用的建议,请参阅下面的答案。]
  • @LocalClient 注释的测试用例未被 OpenEJB 引擎识别为实际被正确拾取和处理(例如我的 MDB)

  • 在此先感谢您的任何帮助或指导。

    最佳答案

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

    为了确保测试类被正确选取,请确保在 application-client.xml 中放置一个名为 src/test/resources/META-INF 的文件,其中包含以下内容:



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

    关于java - OpenEJB 本地客户端注入(inject)失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6254947/

    10-08 21:53