1

各テストが独自に実行される場合、依存する EJB コンポーネントのスタブを使用して、OpenEJB で実行される単体テストで動作する代替記述子を取得することができました。しかし、テスト スイートを導入すると、デプロイメント記述子はスイートに追加された最初のテストから取得されるようです。

それをよりよく説明するためのいくつかのコード。テスト中のBeanは次のようなものです

@Stateless
@Local(A.class)
public class ABean implements A {
     // Bean implementation, no dependencies
}


@Stateless
@Local(B.class)
public class BBean implements B {

     @EJB
     A aBean;  // Dependency to ABean

     // Rest of the implementation
}

B のテストケース (A のテストケースも同様ですが、代替記述子を使用するためのプロパティが設定されていません)

public class BBeanTest {
    private B bean;

    @Before
    public void bootContainer() throws Exception {
        Properties props = new Properties();
        props.put(Context.INITIAL_CONTEXT_FACTORY,
               "org.apache.openejb.client.LocalInitialContextFactory");
        props.put("openejb.altdd.prefix", "test");  // Use stubs

        System.out.println("boot B: " + props);

        context = new InitialContext(props);
        bean = (B) context.lookup("BBeanLocal");
    } 
}

前述のように、これはすべて単独で実行すると問題なく機能します。代替記述子は、A インターフェイスのスタブ実装を挿入します。

次のテスト スイートを使用すると、状況が悪化し始めます。

 @RunWith(Suite.class)
 @Suite.SuiteClasses({
   ABeanTest.class, 
   BBeanTest.class
 })
 public class MySuite {
      // Empty on purpose, annotations do the trick
 }

このスイートを実行すると、B をテストするための代替記述子は使用されません。ただし、出力は、少なくとも各テストの前にプロパティが設定されていることを示しています

 boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory}
 boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory}
 boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory}
 boot B: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory, openejb.altdd.prefix=test}
 boot B: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory, openejb.altdd.prefix=test}

テストをスイートにロードする順序を逆にすると、つまり ABeanTest.class の前に BBeanTest.class を追加すると、代替記述子が使用されます。ABean には依存関係がないため、この場合は問題なく動作しますが、複数の代替記述子を使用する大規模なセットアップでは問題が発生する可能性があります。

ポインタはありますか?

前もって感謝します。

EDITログ出力に基づいて、コンテナは実際には最初のテストで1回だけ起動されます。実行に 2.5 秒、他の実行には約 0.001 秒かかります。

EDIT2 OpenEJB のバージョンはApache OpenEJB 3.1.4 ビルドです: 20101112-03:32

4

1 に答える 1

1

ログ出力に基づいて、コンテナーは実際には最初のテストで 1 回だけ起動されます。実行に 2.5 秒、他の実行には約 0.001 秒かかります。

お気づきのとおり、初期化は 1 回だけ行われます。


@RunWith(Suite.class)
 @Suite.SuiteClasses({
   ABeanTest.class, 
   BBeanTest.class
 })

したがって、この場合、ABeanTest と BBeanTest の両方が、ABeanTest によって設定されたのと同じ初期コンテキスト プロパティを使用して、同じコンテナ インスタンス内で実行されました。

あなたの場合、2 つのテスト クラスに異なる設定が必要なので、ABeanTest @AfterClass でコンテナー インスタンスをダンプし、BBeanTest で新しいものを使用するとよいと思います。

このブログ投稿はその方法を示しています

于 2011-10-04T17:12:35.027 に答える