2010-09-15 104 views
7

我正在研究Java EE 6應用程序。當我開始時,我正在爲EJB類編寫測試,方法是手動實例化EJB,然後手動添加通常由依賴注入提供的成員。隨着應用程序變得更加複雜,我發現這種方法並沒有削減它。所以我希望能夠在測試框架中啓動自己的EJB容器,以便它可以管理我的bean。什麼是最好的方法來解決這個問題?我聽說過javax.ejb.embeddable.EJBContainer,還有其他的選擇嗎?EJB測試策略?

(我使用Glassfish的3,和建築使用Maven,如果有什麼差別。)

回答

2

究竟什麼是你的測試?邏輯?組態?你需要直接測試EJB類嗎?您的測試對於正在運行的容器的EJB客戶端行爲足夠了嗎? (記得有沒有規定說自動單元測試不能要求一個運行系統下測試。)

如果您需要進行測試,移動代碼到POJO和測試正常業務邏輯;您不需要再測試在容器中運行的POJO,因爲容器不應該影響業務邏輯。

在相關的情況下,我從來沒有直接的JUnit測試一個servlet類或Struts控制器類。我肯定考的POJO那些依賴的對象,我測試的終端應用(在servlet容器中,用測試的HtmlUnit運行),假設如果最終應用的工作原理,那麼管道工程太。

+0

顯然,測試的POJO更加容易。但是我無法將所有的邏輯從我的EJB中移出來並放到獨立的類中 - 如果我能這樣做,我首先不會使用EJB。作爲一個運行中的容器的EJB客戶端是一個很好的描述我正在嘗試做什麼,我只是想找出實現這個目標的最佳方法。 – 2010-09-15 21:21:12

+0

我認爲你對測試部署的應用程序是正確的。我試圖得到的EJBContainer爲我工作(使用的是GlassFish嵌入式作爲實現),通過大量的籃球躍升做出持久性的工作,最後退出時,我意識到,一個EJB計時器服務(我的應用程序在幾個地方依賴於)沒有提供。我意識到,即使我設法組裝某種引擎來運行我的EJB,它也不會複製真實容器中的所有條件,所以這將是一個無用的測試。 – 2010-09-16 01:06:33

+4

'請記住,沒有規則說自動化單元測試不能要求正在運行的被測系統'呃,實際上,有規則和這樣的測試不是單元測試,根據定義:) – 2010-09-16 01:32:16

0

我不能完全肯定是否可以幫助你的情況,但看看Smokestack。我個人不在EE空間中工作(Servlet規範之外),但我確實在某一時刻看到了關於此的演示文稿,並且看起來可以滿足您的需求。

2

我聽說過javax.ejb.embeddable.EJBContainer,還有其他選擇嗎?

EJBContainer API是一個選項。另一個將使用Arquillian(和SchrinkWrap)。

一些更多的鏈接:

+0

Arquillian看起來相當不錯,但它似乎並沒有提供EJB定時器服務,所以在我的情況下,它的實用性會受到限制。另見我對羅德尼的迴應。 – 2010-09-16 01:09:19

+0

@Mike您確定* glassfish嵌入式不提供EJB定時器服務? AFAIK,玻璃魚嵌入式是一個「真正的」容器。 – 2010-09-16 01:19:54

+0

它似乎應該可用,但是當我通過EJBContainer API使用它時,我收到一條有關定時器服務不可用的錯誤消息。我找不到任何相關的文檔,除了一個簡短的論壇發佈說玻璃魚嵌入式沒有計時器服務。可能有辦法讓它工作,但我沒有時間弄清楚,我可以通過其他方式得到我需要的東西。 – 2010-09-16 16:35:18

0

現在有Arquillian,開發商不應該需要反覆折騰的嵌入式Java EE容器了。