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);
    }
}

しかし、それはまだ失敗しています。私はこのイディオムがとても好きで、自分のプロジェクトでうまく使えたらとてもワクワクします。

その他の注意事項:

  • OpenEJB にクラスパスをスキャンするように指示するために Apache が提案するように、「空の」ejb-jar.xml (src/main/resources 内) と application-client.xml (src/test/resources 内) を提供しています [UPDATE: as結局のところ、私はこれを間違っていました。私のために働いた提案については、以下の私の回答を参照してください。]
  • で注釈が付けられたテスト ケース@LocalClientは、OpenEJB エンジンによって実際に取得され、適切に処理されていると識別されません (たとえば、私の MDB はそうです)。

ヘルプやガイダンスをお寄せいただきありがとうございます。

4

2 に答える 2

7

この問題は、使用可能なモジュールの種類を OpenEJB に示唆する記述子の不適切な場所が原因である可能性があります。

テストクラスが適切に取得されるようにするには、次の内容のapplication-client.xmlatという名前のファイルを配置していることを確認してください。src/test/resources/META-INF

<application-client/>

これにより、OpenEJB は@LocalClientアノテーションの存在をスキャンして反応するようになります。

于 2011-06-06T17:56:48.247 に答える