關於powermock
在TDD領域Mock框架有很多,比如EasyMock,JMock,Mockito。可能有些同學會好奇了,為什么要重點把powermock拿出來呢,因為powermock可以解決前面三種框架不能解決的問題,而且powermock也是是單元測試中極其強大的測試框架。
powermock特點
- 主要圍繞着Junit、TestNg測試框架開展進行
- 對所依賴的Jar包非常的苛刻,出現jar包的沖突或者不一致就不能使用
- PowerMock也是一種Mock,主要是解決其他Mock不能解決的問題,通俗的講,就是專治各種不服
powermock入門實例
1、引入依賴jar包
<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>1.6.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.6.1</version> <scope>compile</scope> </dependency>
2、實際案例
模擬場景:新增學生操作
先建一個名為StudentService的類,用來模擬服務調用操作,在這個類中新增一個方法,來模擬查詢總共有多少個學生。
具體示例代碼如下:
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao; /** * @author rongrong * @version 1.0 * @date 2019/11/17 21:13 */ public class StudentService { private StudentDao studentDao; public StudentService(StudentDao studentDao) { this.studentDao = studentDao; } /** * 獲取學生個數 * * @param studentDao */ public int getTotal(StudentDao studentDao) { return studentDao.getTotal(); } }
可以看出創建service需要傳遞StudentDao這個類,接着我們再來創建StudentDao這個類,用於進行新增操作。
具體示例代碼如下:
package com.rongrong.powermock.dao; /** * @author rongrong * @version 1.0 * @date 2019/11/17 21:15 */ public class StudentDao { public int getTotal() { throw new UnsupportedOperationException(); } }
仔細看,你會發現,你肯定調不了dao了,這回傻了吧,哈哈哈!!!
你會好奇這塊為啥我要拋出UnsupportedOperationException異常呢,因為我就想模擬服務不可用的情況(實際中經常會遇到可能由於某種原因(沒有完成,或者資源不存在等)無法為 Service 服務),這樣的情況,難道我們就不測試了嗎?
那我還是乖乖的把測試用例寫完,並測試下吧,下面我們再來創建一個名為StudentServiceTest的測試類。
具體示例代碼如下:
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao; import org.testng.annotations.Test; /** * @author rongrong * @version 1.0 * @date 2019/11/17 21:19 */ public class StudentServiceTest { @Test public void testAddStudent() { StudentDao studentDao = new StudentDao(); StudentService studentService = new StudentService(studentDao); studentService.getTotal(studentDao); } }
上面的測試用例肯定會執行失敗,那我們也來執行下看,效果如下圖:
我們先將這個報錯,腦補為鏈接不上數據庫,問題很明顯,數據庫掛了,就是連接不上了,等着服務器好了得三天后,可是今晚領導就要看功能實現,你該怎么辦?無法測試service,難道就真的結束了嗎?
答案是否定的,此時我們用powermock便可完美解決問題,接下來我們請出powermock登場。
具體代碼如下:
package com.rongrong.powermock.service; import com.rongrong.powermock.dao.StudentDao; import org.powermock.api.mockito.PowerMockito; import org.testng.Assert; import org.testng.annotations.Test; /** * @author rongrong * @version 1.0 * @date 2019/11/17 21:19 */ public class StudentServiceTest { @Test public void testGetStudentTotal() { StudentDao studentDao = PowerMockito.mock(StudentDao.class); PowerMockito.when(studentDao.getTotal()).thenReturn(666); StudentService studentService = new StudentService(studentDao); int total = studentService.getTotal(studentDao); Assert.assertEquals(total, 666); } }
這時再次運行,你會發現神奇般的運行通過,結果如下圖所示:
是不是很神奇,很驚喜,沒錯,這個框架就是這么強大。
我們可以這樣理解mock就是創建一個假的該對象,然后需要你告訴這個對象調用某個方法的時候返回某個你指定的值即可。
到此,一個簡單powermock入門結束,如您覺得好,請繼續關注我,謝謝支持!