2011-09-14 36 views
2

我開始探索在嵌入模式下使用OpenEJB來對我的EJB3組件進行單元測試的可能性。起初,我得到了像下面的輸出關於在嵌入模式下使用OpenEJB進行單元測試的困惑

Testsuite: HelloBeanTest 
Tests run: 4, Failures: 0, Errors: 4, Time elapsed: 1,779 sec 
------------- Standard Output --------------- 
Apache OpenEJB 3.1.4 build: 20101112-03:32 
http://openejb.apache.org/ 
------------- ---------------- --------------- 
------------- Standard Error ----------------- 
log4j:WARN No appenders could be found for logger 
(org.apache.openejb.resource.activemq.ActiveMQResourceAdapter). 
log4j:WARN Please initialize the log4j system properly. 
------------- ---------------- --------------- 

Testcase: sum took 1,758 sec 
Caused an ERROR 
Name "HelloBeanLocal" not found. 
javax.naming.NameNotFoundException: Name "HelloBeanLocal" not found. 
at org.apache.openejb.core.ivm.naming.IvmContext.federate(IvmContext.java:193) 
at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:150) 
at 
org.apache.openejb.core.ivm.naming.ContextWrapper.lookup(ContextWrapper.java:115) 
at javax.naming.InitialContext.lookup(InitialContext.java:392) 
at HelloBeanTest.bootContainer(Unknown Source) 

# ... output is the same for all the rest of the tests 

的openejb.home屬性設置爲系統屬性,並指向我OpenEJB的安裝目錄錯誤。

HelloBeanTest#bootContainer()是一個setUp方法,它在JNDI查找時失敗。如下所示。

@Before 
    public void bootContainer() throws Exception{ 
    Properties props = new Properties(); 
    props.put(Context.INITIAL_CONTEXT_FACTORY, 
      "org.apache.openejb.client.LocalInitialContextFactory"); 
    Context context = new InitialContext(props); 
    hello = (Hello) context.lookup("HelloBeanLocal"); 

} 

像這樣的問題所困擾,我開始嘗試OpenEJB的非嵌入模式,並開始從它的安裝目錄中的容器和部署的組件作爲ejb.jar。部署成功,我開始創建一個獨立的Java客戶端。獨立的Java客戶端仍未完成,但同時我又回到了嵌入式模式下的測試。

令我驚訝的是,測試突然開始了。我向組件添加了更多功能併爲這些功能進行了測試。一切正常。以下是該運行的輸出。

Testsuite: HelloBeanTest 
Tests run: 4, Failures: 0, Errors: 0, Time elapsed: 2,281 sec 
------------- Standard Output --------------- 
Apache OpenEJB 3.1.4 build: 20101112-03:32 
http://openejb.apache.org/ 
------------- ---------------- --------------- 
------------- Standard Error ----------------- 
log4j:WARN No appenders could be found for logger 
(org.apache.openejb.resource.activemq.ActiveMQResourceAdapter). 
log4j:WARN Please initialize the log4j system properly. 
------------- ---------------- --------------- 

Testcase: sum took 2,263 sec 
Testcase: hello took 0,001 sec 
Testcase: sum2 took 0 sec 
Testcase: avg took 0,001 sec 

我愉快地編碼和測試,直到它再次爆發。看起來,從/ apps目錄中刪除ejb.jar導致了它。因此,看起來OpenEJB仍然從安裝目錄執行JNDI查找,但使用當前目錄查找在嵌入模式下運行時的實際實現。我做出了這個結論,因爲部署在apps/dir中的ejb.jar沒有本地版本所有的所有方法。 (我再次用javap檢查過。)只有類簽名是相同的。

經過這麼長時間的介紹,這是問題時間。

  • 任何人都可以提供這種行爲的任何解釋?
  • 在測試之前打包和部署應用程序/目錄中的EJB是一項簡單的任務,但是我能確定即使那樣我正在測試正確的實現嗎?
  • 這是否與openejb.home屬性指向OpenEJB安裝目錄有關?

對於總結,OpenEJB的版本是的Apache OpenEJB的3.1.4版本:20101112-03:32,這是可見在日誌輸入輸出。

在此先感謝。

回答

1

它的確與設置openejb.home指向安裝目錄有關。

有一個conf/openejb.xml文件,其中apps/可能被列爲部署所在的位置。所有日誌輸出都轉到logs/目錄,而不是在測試用例的System.out中,您可以輕鬆讀取它。

要使用嵌入式OpenEJB,您不需要任何配置文件,目錄或端口。您只需將這些庫包含在項目的類路徑中。

我要說的第一件事就是檢查openejb-examples-3.1.4.zip。可能有二十多個示例項目都使用Ant和Maven構建腳本進行設置。只要OpenEJB庫位於類路徑中,所有示例都可以在任何環境中使用。這是一個使用unit test in Eclipse的例子之一的視頻。我建議將simple-stateless作爲最佳起點。

+0

好吧,我得到它的工作,或似乎。我進行了配置,以便僅將openejb.configuration系統屬性設置爲指向一個openejb.xml配置文件,我在其中定義在哪裏查找bean。測試通過,輸出在報告中給出,並且openejb.home屬性指向我的項目目錄。 – kaskelotti

+0

然後再打開文件[OpenEJB的網站說(http://openejb.apache.org/embedding-openejb.html) _「如果你使用OpenEJB的本地服務器,你實際上是使用作爲OpenEJB的嵌入式庫。這意味着當您的應用程序啓動時,OpenEJB也將在您的虛擬機中啓動。您可能不希望在安裝了OpenEJB的目錄中執行您的應用程序,但希望在您開發應用程序的位置執行它。很好,但你需要告訴OpenEJB它的安裝位置,爲此,設置「openejb.home」系統變量。「_ 混淆? – kaskelotti

+1

感謝您的鏈接,它是一個孤兒頁面,非常過時。它現在包含[本頁]的內容(http://openejb.apache.org/local-server.html)。請嘗試不使用任何'openejb.configuration'或'openejb.home'設置。它可以與這些工作,但它不會很有趣。指向指向應用程序目錄的配置文件有點脆弱。測試中的文件路徑可能有問題。 OpenEJB能夠使用類路徑本身來查找應用程序,並將創建任何所需的容器,而不需要配置。 –