2009-11-09 58 views
1

我們有一個基於Spring + Ibatis的J2EE應用程序。我計劃用測試用例來包裝我們的DAO(通過獲取spring bean來調用iBatis模板)。我對JUnit沒有太多的經驗,所以我認爲只需製作一個DAO對象,然後調用其中一種方法即可。但我錯了,事實證明,整個J2EE應用程序都運行在appserver(容器)上,但顯然JUnit測試用例不在容器中。所以,在我的測試情況下,當我做的DAO對象,並調用的方法...它不能在這樣的線,是在我的DAO方法這個春季訓練有用嗎?

ApplicationInitializer.getApplicationContext().getBean("myMapclientBean"); 

所以我對谷歌狩獵去了.. 。在一些帖子中發現了一些帖子,並且跟着我結束了Spring的4 day training course

想知道你對這個課程有什麼看法?這對價格有價值嗎?一個人也可以自己學習這個東西嗎?通過以下幾本書? (也許不是在4天內,而是在一個月內)。

哦,我仍然無法單元測試這些DAO的......> _ <

+0

如果你在測試中觸摸數據庫,那麼它不是一個單元測試;這是一個集成測試。現在,使用JUnit也可以進行集成測試,但您需要了解其差異。 Spring爲JUnit和TestNG提供集成測試支持 - 查看參考手冊。 – SteveD 2009-11-09 21:23:08

+0

謝謝。知道這種差異也會幫助我進行谷歌搜索。 – Drake 2009-11-09 21:25:18

+0

您可能想要打開一個新的問題來處理單元測試問題。你可能會得到更好的答案,因爲這個實際上更多的是關於Core Spring課程。 – Jeff 2009-11-09 21:33:46

回答

5

我把Spring核心課程約一年半前。從那時起,教學大綱顯然發生了一些變化,儘管它仍然非常相似。導師非常能幹。在參加本課程之前,我正在和Spring一起工作,但在課堂上,我感覺我學會了如何做得更好。

我想你大概可以從書籍,Spring的在線文檔和源代碼本身獲取所有原始信息,但是該類所做的是將所有內容連接在一起並教授最佳實踐。也就是說,不只是「如何」,還有「爲什麼」和「何時」你應該使用這樣的功能。這就是爲什麼我覺得我的技能有所提高。

指導老師很高興回答關於課外作業以外的具體實際問題的問題。因此,帶着問題武裝起來是個好主意。

該課程並不便宜。是否值得這取決於你是否在教室和自我教學方面做得很好,並利用在線社區和同齡人獲得書本所不具備的最佳實踐的感覺。另外,請記住,Spring正在不斷髮展。雖然你可以從課堂上獲得良好的基礎,但你仍然需要適應新的道路(或者上另一門課程)。

+1

也參加了課程,我同意所有的一切@Jeff說。海事組織是非常值得的。 – 2009-11-09 20:55:48

+0

謝謝你們。這很有幫助。我會問我的小公司,看看他們是否願意....或者我會開始潛伏在工作中。 既然你們接受了培訓,你可以告訴我如果J2EE應用程序在容器(應用程序服務器)中工作,Testcases將如何工作。我的意思是所有的數據源和東西都在應用服務器上...所以當你的DAO從應用服務器獲取數據源時,jUnit如何工作? – Drake 2009-11-09 20:59:44

+0

您的描述聽起來更像是一個集成測試,而不是單元測試......但在測試DAO和數據庫時似乎總是如此。你可能想看看AbstractTransactionalDataSourceSpringContextTests類。這可能也適用於你:http://iamjosh.wordpress.com/2007/12/11/unit-testing-dao-classes-with-junit-spring/ – Jeff 2009-11-09 21:30:04

0

手頭解決問題:

當使用Spring,你豆真不該出去的ApplicationContext,並要求他們所需要的豆類 - 他們應該提供setter方法(或構造函數),這樣的依賴關係可以注射。

聽起來像是設計這些類的人做了與依賴注入相反的操作。

+0

底下...背景即將到來像這樣springContext = WebApplicationContextUtils .getWebApplicationContext(event.getServletContext()); 可否請你提供一些你認爲應該如何讓Junit測試用例能夠在容器外部使用這些bean的示例? – Drake 2009-11-09 21:24:00

+0

儘管Spring MVC教程專門針對MVC框架,但它對於Spring,IMO來說是一個很好的介紹。 http://static.springframework.org/docs/Spring-MVC-step-by-step/依賴注入意味着一個類被賦予*它的依賴關係,而不是它出去並找到它們。 – 2009-11-10 03:30:13

1

在回答問題的第二部分(我沒有春季課程的經驗,所以不能評論)。

您可以使用Junit測試中定義的應用程序上下文,然後像從服務器容器中那樣實例化DAO,如果您使用的是Junit 3.8或更早版本,那麼通過讓測試用例擴展爲AbstractTransactionalDataSourceSpringContextTests

如果您使用的是以後的Junit版本(4+),則可以使用Spring TestContext框架和註釋。

兩個比我在這裏可以從Spring解釋好得多,並在此註解RefCard

+0

-1 - AbstractTransactionalDataSourceSpringContextTests是一個流產。所以Spring提供了很多測試用例擴展。 AbstractSpringSpringContextTests是你應該停止使用它們的地方 - 在那之後它們會變得越來越糟糕。 – MetroidFan2002 2009-11-09 21:19:14

+0

它肯定有意見。只要顯示選項,問問題的人就可以找到自己的方式來完成任務。 – TomY 2009-11-09 21:37:45

+0

我已經使用了AbstractTransactionalDataSourceSpringContextTests路由。爲我工作。我已經實例化了我們在工作中使用的遠程處理項目,這構成了我們的junit測試的基礎。通過 public class TestBase extends AbstractDependencyInjectionSpringContextTests 2009-11-10 15:42:06

0

我用過的AbstractTransactionalDataSourceSpringContextTests路線。爲我工作。我已經實例化了我們在工作中使用的遠程處理項目,這構成了我們的junit測試的基礎。通過

import org.springframework.test.AbstractDependencyInjectionSpringContextTests; 
public class TestBase extends AbstractDependencyInjectionSpringContextTests 
{ 
    protected String[] getConfigLocations() 
    { 
    return new String[] { "classpath:conf/dataAccessContext.xml",  "classpath:conf/applicationContext-domain.xml", 
    "classpath:conf/applicationContext-service.xml", "classpath:conf/applicationContext-dao.xml" }; 
    } 

    protected Object getBeanToTest(String beanName) 
    { 
    return applicationContext.getBean(beanName); 
    } 

    protected Object getBeanToTest(Class clazz) 
    { 
    return applicationContext.getBean(clazz.getName()); 
    } 

}