2012-11-26 56 views
0

經過漫長的缺席,我正在返回Java EE,因此我基本上必須從頭開始學習現代EE。作爲這一努力的一部分,我正在努力學習。我有一個實用的沙盒可供使用 - 一個簡單的應用程序,前端由EJB通過JPA與數據庫通信支持。運行JUnit反對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: No EJBContainer provider available: no provider names had been found. 

如何解決這個?或者,我的方法根本上是錯誤的 - 以某種方式?

回答

0

這不是一個直接的答案。事實上,我不知道如何解決你的特定問題,對不起。如果你感到煩惱,請告訴。

但是,如果您目前正在開始(再次)使用Java EE,那麼我會建議您放棄使用EJB測試的vanilla JUnit,以支持Arquillian。的Arquillian的一大優點是,它需要包裝測試,實際的服務器上部署它(或emebdded服務器,如果你選擇),並運行agains您的實際環境的測試服務。

爲了幫助您入門,請查看並運行Arquillian showcase中的一些示例。

這聽起來很熱情,但我們從JUnit的切換到大約6個月前的Arquillian超越簡單的單元測試大多數測試,此後一直沒有回頭。

4

好了,EJBContainer API需要被提供在classpath的EJBContainerProvider SPI實現。對於GlassFish,您需要在您的類路徑中嵌入GlassFish JAR。如果您使用的是Maven,則這些org.glassfish.extras:glassfish-embedded-all:3.1.1是3.1.1嵌入版本的座標。

這就是說,你最好使用的Arquillian來管理EJB容器的生命週期。雖然它可能不是現在很重要,它讓你保留你的部署EJB來,你應該體驗是地方性的嵌入式Java EE容器類路徑中的污染問題,真正的容器的選擇。