0

久しぶりに Java EE に戻るので、基本的に最新の EE をゼロから学ばなければなりません。その努力の一環として、私は実際に学ぶことを試みています。JPA を介してデータベースと通信する EJB によってフロント エンドがサポートされるシンプルなアプリです。

学習を支援するために、いくつかの JUnit テストをセットアップしようとしています。残念ながら、それらは機能していません。私は多くの点で「モンキー シー、モンキー ドゥ」段階をはるかに超えていないので、私が見ている問題を解決する方法に困惑しています。

以下は、 MyEJB をテストするためにセットアップしたコードで、 と として定義され@Statelessてい@LocalBeanます。(問題があれば、Glassfish/Eclipse を実行しています。)


public class MyEJBTest {
    private static EJBContainer ejbContainer;

    private MyEJB myEJB; 

    @BeforeClass
    public static void startTheContainer() {
        ejbContainer = EJBContainer.createEJBContainer();
    }

    @Before
    public void lookupABean() throws NamingException {
        Object object = ejbContainer.getContext().lookup("java:global/simple-stateless/MyEJB");

        assertTrue(object instanceof MyEJB);

        myEJB = (MyEJB) object;
    }

    @AfterClass
    public static void stopTheContainer() {
        if (ejbContainer != null) {
            ejbContainer.close();
        }
    }

    @Test
    public void testFind() {
        MyEntity myEntity = myEJB.find(1); 
        assertTrue(myEntity != null);
        assertEquals("First Row's Name", myEntity.getName());
    }

}

これを JUnit テストとして実行すると、startTheContainer()呼び出しで次のエラーが発生します。

javax.ejb.EJBException: 使用可能な EJBContainer プロバイダーがありません: プロバイダー名が見つかりませんでした。

これを修正するにはどうすればよいですか? または、私のアプローチは根本的に間違っていますか?

4

1 に答える 1

4

APIEJBContainerでは、EJBContainerProviderSPI 実装をクラスパスで使用できるようにする必要があります。GlassFish の場合、クラスパスに埋め込まれた GlassFish JAR が必要です。Maven を使用している場合、これらorg.glassfish.extras:glassfish-embedded-all:3.1.1は 3.1.1 組み込みバージョンへの座標です。

とはいえ、Arquillian を使用して EJB コンテナーのライフサイクルを管理した方がよいでしょう。今は重要ではないかもしれませんが、組み込み Java EE コンテナーに固有のクラスパス汚染の問題が発生した場合に、EJB を実際のコンテナーにデプロイするオプションを保持できます。

于 2012-11-27T10:02:42.623 に答える