JUnit+JMockit單元測試
1、簡介
2、JUnit
2.1 pom中增加Junit的jar的依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
</dependency>
2.2 增加單元測試類
例如,要測試的類為src下的com.runqianapp.userManager.dao.UserDao類中的
publicStringgetUserName(StringuserId)方法
則首先新建一個test的源碼目錄,原因是測試代碼要與原功能代碼分離,自動構建的時候,只需要把原功能的代碼構建到最新的jar里。然后新建跟被測試類相同的包路徑,如
test下的com.runqianapp.userManager.dao.UserDaoTest
這樣,就為UserDao建好了一個單元測試類,
對于被測試的方法,需要傳不同的參數,來檢驗方法的正確性,這個時候,不必寫多個@Test來測試,而是把需要傳入的參數放入配置文件,然后讀配置文件。
參數配置文件的位置是與單元測試類同一目錄下,如
test下com.runqianapp.userManager.dao.testData_UserDao
2.3 JUnit的常用注解介紹
2.3.1 @Test
需要運行的單元測試方法,可以有多個
2.3.2 @Before
在每一個@Test方法運行之前都會被運行,可以用來初始化方法
2.3.3 @Before
在每一個@Test方法運行之后都會被運行,可以用來方法的釋放資源
2.3.4 @BeforeClass
針對整個單元測試類,只會被運行一次,在所有方法運行之前被運行,可以用來初始化環境
必須聲明成staticvoid
2.3.5 @AfterClass
針對整個單元測試類,只會被運行一次,在所有方法運行之后被運行,可以用來釋放資源
必須聲明成staticvoid
2.4 斷言
對于需要測試的方法,用斷言來判斷其它執行結果是否正確。
assertEquals([Stringmessage],expected,actual)
message是個可選的消息,將會在發生錯誤時報告這個消息。
expected是期望值,通常都是用戶指定的內容。
actual是被測試的代碼返回的實際值。
如:
booleansuccess=update();
assertEquals(“更新是否成功”,true,success)
這樣,當運行update()的返回值不為true的時候,這個單元測試就會失敗。
但有些時候,我們測試的方法并沒有返回值,方法只是執行一個動作,那么這個時候,我們就不能用判斷的返回值來判斷方法是否執行成功。
如新建文件的方法,publicvoidcreateFile(StringfilePath),這個時候,方法并沒有返回值,我們在判斷方法是否執行成功的時候,可以寫一個輔助方法,來檢查一下指定的文件是否新建成功了,以此來驗證createFile()的準備性。如:
createFile(“d:/a.txt”); booleanexist=fileExist(“d:/a.txt”); assertEquals(“新建文件”,true,exist); |
3、JMockit
當我們在編寫單元測試的時候,常常會出現一些如調用的方法需要其它對象提供,而這個類現在又不具備,如很難創建、沒有環境、沒有開發完等情況,這個時候,我們就需要用JMockit模擬出一個類,來滿足我們的需求,來完成我們核心功能的測試。
3.1 pom中增加JMockit的依賴
<dependency> <groupId>jmockit</groupId> <artifactId>jmockit</artifactId> <version>1.0</version> <scope>test</scope> </dependency> |
3.2 模擬對象
如需要測試的一個方法的一個值是配置在misInitConfig.xml中的,而misInitConfig.xml中的值需要用ReadConfInfo.getPropery()來獲取,而ReadConfInfo是在應用啟動時初始化的,這個時候并沒有web環境,也不能初始化,而我們也不需要自己手動初始化ReadConfInfo,因為我們測試的重點不是ReadConfInfo,而是我們現有的功能。這個時候,我們就可以用JMockit模塊出ReadConfInfo,來完成此功能的測試。
/** *模擬ReadConfInfo */ publicstaticvoidmockReadConfInfo(){ newMockUp<ReadConfInfo>(){ @Mock publicStringgetPropery(StringpropertyName){ if("conf_loglevel".equals(propertyName)){ return"debug"; }elseif("conf_logfolder".equals(propertyName)){ return"log"; }else{ return""; } } } } |
在單元測試的@BeforCalss中初始化,
/** *初始化環境 */ @BeforeClass publicstaticvoidinit()throwsException{ //模擬ReadConfInfo mockReadConfInfo(); } |
這樣,我們就可以在程序中使用ReadConfInfo.getPropery()來完成我們的功能了。
posted on 2014-03-27 16:30 順其自然EVO 閱讀(522) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄