2012-08-31 112 views
1

我目前正在研究使用JUnit測試EJB 3服務的解決方案。 (是的,我已經看過ejb3unit,但它不適用於我。是的,我已經看過與openEJB集裝箱集成測試,但這並沒有解決..)在沒有容器的情況下解決EJB依賴關係

所以我的問題是什麼將是解決@EJB註釋的依賴關係的方式?我並不是說使用像Weld,Guice或Spring這樣的DI框架。該解決方案應該適用於普通的舊版JUnit測試 - >而不使用像JBoss,Glassfish或openEJB這樣的EJB容器。

我能夠通過@PersistenceContext替換實體管理器的注入,並使用java反射進行一些破解。那麼,我將如何做與@EJB註釋依賴關係?

(我不介意建設和解決的依賴關係樹自己,只是爲了尋找思路;))來自德國

問候, 附:

回答

0

你看Arquillian嗎? 您可以在項目頁面找到所有文檔:http://www.jboss.org/arquillian.html

+0

他不希望涉及一個容器,afaik你需要一個容器。 –

+0

我正在使用一個非常舊的代碼庫,運行在JBoss 4.2上。我給了Arquillian幾個鏡頭,但對於JBoss 4.2,我真的很難讓它工作。 (如果有人會指點我關於使用jboss 4.2配置arquillian的方法,我可能會再考慮一下。)我當然不想「重新發明輪子」,但我認爲編寫自己的代碼也是一個不錯的挑戰小的DI框架;) –

2

不確定爲什麼你反對你提出的解決方案。
我正要提供諸如Arquillian之類的東西,但是,嘿 - 你不想擁有一個容器。
我只想確定你不想容器的原因,然後再繼續討論一些想法(雖然我沒有測試它們) -
隨着JBoss AS 7.x企業應用服務器的部署時間非常長減少,
更不用說,使用Arquillian你有一個部署API,並且你可以決定你將要部署什麼(例如 - 部署例如一個給定測試的單個bean)。
但是,我尊重你的問題,所以這裏有一些想法 -
答:你提到你設法使用反射注入一個EntityManager - 你是怎麼做到的?
爲什麼不把它們應用到你的豆子?

B.如果您遇到A問題,爲什麼不根據cglib開發自己的注射代碼(例如爲了創建代理不僅僅是爲了接口,而且是爲了類)。
這樣,創建類的對象時,
您將能夠截取默認的CTOR,
並掃描用@Ejb註釋的字段。
我建議使用某種配置文件,爲每個bean接口映射如何實例化一個適當的類,並反覆運行此流(因爲注入的bean也可能有一個帶有@EJB註釋的字段)。

請注意,如果您決定使用這種工作方法,您將實施某種「微型依賴性注入框架」 - 除了我個人感興趣看到您的代碼(:)的事實,我認爲你應該仔細想想爲什麼你不想使用「已經制作好的解決方案」。

+0

關於「爲什麼不arquillian」看看我下面的評論;) 至於注入EntityManager .. 我們有一個封裝實體管理器的EJB服務。該服務只有一個界面。所以我通過反射檢查了界面類型,並通過java反射注入了一個「真正的」javax.persistence.entitymanager。 (結果與思考私人領域不是私人..;) 至於其他EJB ..它也發生在我身上,我必須遍歷整個依賴鏈或回退到像映射配置文件。但thx爲您的回覆=) –

1

關於Arquillian建議的注意事項,仍然需要EJB容器,比如JBoss,GlassFish或OpenEJB。

如果問題僅僅是尋找和包括所有的依存關係,試試這個罐子,其中包括所有的EJB精簡版所需的依賴關係:

http://repo1.maven.org/maven2/org/apache/openejb/openejb-lite/4.0.0/openejb-lite-4.0.0.jar

包括在測試的classpath(不需要其他罐子)然後就啓動嵌入容器:

EJBContainer container = EJBContainer.createEJBContainer(); 
MyBean bean = (MyBean) container.getContext().lookup("java:global/myModleName/MyBean"); 

工作實例here

+1

嗯,我試了一下,但嘗試創建EJBContainer(特別是在EJBContainer.createEJBContainer())時拋出異常:「java.lang.NoSuchMethodError:javax.ejb.ApplicationException.inherited ()「可以在這裏找到完整的堆棧跟蹤:http://pastebin.com/gk3HFw25 –

相關問題