單元測試Author: 江南白衣 注重實(shí)效的TDD的確能加快,而不是拖慢開發(fā)的進(jìn)度(片面的追求覆蓋率的全面UnitTest不在此列) 1.單元測試的兩種風(fēng)格1.1 純MockObject的風(fēng)格Rod的<Professional J2EE with Spring>的例子即是這種風(fēng)格。這種風(fēng)格不依賴Spring與ApplicationContext,完全絕對的分層開發(fā)。但缺點(diǎn)是需要手工注入所有依賴bean,手工設(shè)置所有出場對象的方法和假定返回值,代碼量非常巨大,而且這種Mock UT離實(shí)際環(huán)境很遠(yuǎn),仍然需要再寫一套集成測試的Test Case。 1.2 Pragmatic風(fēng)格SS的風(fēng)格是使用Spring,load all applicationContext file,自動注入所有測試對象,并利用真實(shí)對象進(jìn)行測試。這樣的好處是開發(fā)人員可以專注于測試檢驗(yàn)代碼的編寫。 僅在需要限定分離解耦某些對象時(shí),才重載public String[] getConfigLocations()函數(shù)限定applicationContext,使用EasyMock Mock對象(見BookManagerMockDaoControllerTest.java) 不過各位老大不是很認(rèn)同這種方式,但懶字當(dāng)頭,使用實(shí)用就了,被bs一下也值得了。
2.Spring下的Unit TestSpring 下的Unit Test主要關(guān)注三個(gè)方面: 2.1 bean的依賴注入能不依靠WebContainer來完成ApplicationContext的建立與POJO的依賴注入一向是Spring的得意之處。 String[] paths = { "classpath:applicationContext*.xml" };
如果你連這也覺得麻煩,那么只要你的testCase繼承于Spring-mock.jar里的AbstractDependencyInjectionSpringContextTests,實(shí)現(xiàn)public String[] getConfigLocations()函數(shù), 并顯式寫一些需要注入的變量的setter函數(shù)。 2.2 Open Session in Test 及自動Rollback 又是來自Spring這個(gè)神奇國度的東西, 你可以讓testCase繼承于AbstractTransactionalDataSourceSpringContextTests,就可以做到Open Session in Test ,解決Hibernate的lazy-load問題;而且接管原來的DAO里的事務(wù)控制定義,通過setDefaultRollback(boolean)方法控制最后回滾還是提交,如果默認(rèn)為回滾,則測試產(chǎn)生數(shù)據(jù)變動不會影響數(shù)據(jù)庫內(nèi)數(shù)據(jù)。 protected PlatformTransactionManager transactionManager; (注,hibernate太奸詐了,如果全部默認(rèn)回滾,只會在session里干活,一點(diǎn)不寫數(shù)據(jù)庫,達(dá)不到完全的測試效果。) BTW.AbstractTransactionalDataSourceSpringContextTests 還通過注入的DataSource創(chuàng)建了一個(gè)JDBCTemplate 對象,可以跑SQL幫忙核對Hibernate的結(jié)果,但要注意兩者的事務(wù)。 2.3.Controller層的Unit Testcontroller層靠Spring提供的MockHttpServletRequest和Response來模擬真實(shí)的servlet環(huán)境,并且spring 2.0了加了一個(gè)AbstractModelAndViewTests,提供一些檢測返回值的utils函數(shù)。 protected XmlWebApplicationContext ctx; 2.4.注意在BaseTest中,setup()函數(shù)被移到 protected void onSetUp() throws java.lang.Exception 在BaseDaoTest中,setup()函數(shù)被移到 protected void onSetUpBeforeTransaction() throws Exception 3. EasyMockMockObject是一樣徹底分層開發(fā)的好東西,而且使用上沒什么難度。而且已不再存在只支持接口不支持Class的限制。 //設(shè)定BookManager MockObject Easy Mock VS JMock: JMock 要求TestCase繼承于MockObjectTestCase太霸道了。妨礙了我繼承于Spring2.0的ModelAndViewTestCase和使用MockDao,RealDao并行的繼承體系。因此采用沒那么霸道的easyMock。 另外,easyMock的腳本錄制雖不如jmock那么優(yōu)美,但勝在簡短易讀。jmock那句太長了 。 4. 顯示層測試還有,顯示層至今沒有什么好的UnitTest方法,無論是不成才的httpUnit們還是笨重的GUI test工具。Appfuse一直用的那個(gè)ThoughtWork那個(gè)Selenium和J3Unit的效果不知如何, 其中J3Unit號稱支持prototype。
|
|
|