日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《PowerMock实战手册》读书笔记及个人总结

發布時間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《PowerMock实战手册》读书笔记及个人总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • 前言
        • 依賴及注解
        • mock local variable
        • mock static
        • mock final class / method
        • mock constructors
        • mock private methods

前言

注:本文總結源自汪文君的e-book 《PowerMock 實戰手冊》, pdf不知道為何導入不了,以下是隨書筆記。

pdf我保存在了百度云里,需要的可以自取
《PowerMock實戰手冊》
鏈接: 密碼: 6hm4

本文目的:通過強大的 mock 編寫出更好的測試用例,幫助實現 Free Bug

前提:具備 mockito 的語法基礎,如果不懂,請移步:
mockito官網文檔
mock 基本套路:

  • 創建 mock 對象
  • 模擬 mock 行為
  • 調用待測試方法
  • 驗證 mock 行為(確認 mock 部分被成功模擬)

github文檔
參考書籍:《Instant Mock Testing with PowerMock》

TDD框架我一般用Mockito,但是只要稍用一段時間就會發現它在實際項目中有很多解決不了的事情,因此出現了PowerMock,
專治各種不服static / constructor / final / private / local variable

補充:如果每次遇到這些代碼都選擇注釋,測起來非常麻煩,還是盡量能嵌入項目中,運用更強大的 mock,但實際項目中很可能還沒這么簡單嵌入,之后實際工作中總結了經驗再來補充。
另外,這些知識,看看就好,寫點 demo,真正用到的時候再完整的來兩遍,就會了,主要是會基本 demo,并且在工作測試的時候用到了能想到來這里查找和運用測試方法,讓測試更簡單。根據使用頻率,決定自己相關需要使用的技術需要熟練到什么程度即可,大可把它們當做參考手冊對待,不必牢記于心,網上用例一搜一大把。

依賴及注解

https://mvnrepository.com/

  • powermock-module-junit4
  • powermock-api-mockito
    找到以上依賴(版本不一樣可能會出現意想不到的問題),引入到本地的 pom 文件中

以下兩個注解在測試 mockito 無法測試的內容時必須的,標注在待測試類上
@RunWith(PowerMockRunner.class)
告訴 junit 使用某個指定 Runner 運行 testCase ,不指定默認用 junit 的 Runner
@PrepareForTest(EmployeeService.class)
為 PowerMock 的 Runner 提前準備一個已經根據某種預期改變過的 class,如需添加更多,改成類似這種即可:@PrepareForTest({EmployeeService.class, EmployeeUtils.class})

mock local variable

  • 有返回值
public class EmployeeService {public int getTotalEmployee() {EmployeeDao employeeDao = new EmployeeDao();return employeeDao.getTotal();} } @Test public void testGetTotalEmployeeWithLocalVariable() {EmployeeDao employeeDao = PowerMockito.mock(EmployeeDao.class);try {PowerMockito.whenNew(EmployeeDao.class).withNoArguments().thenReturn(employeeDao);} catch (Exception e) {Assert.fail("測試失敗.");}PowerMockito.when(employeeDao.getTotal()).thenReturn(10);EmployeeService service = new EmployeeService();int totalEmployee = service.getTotalEmployee();assertEquals(totalEmployee, 10); }
  • 無返回值
    只能用 mock 的 verify 判斷是否被調用

mock static

  • 有返回值
@Test public void testGetEmployeeCountWithMock() {PowerMockito.mockStatic(EmployeeUtils.class);PowerMockito.when(EmployeeUtils.getEmployeeCount()).thenReturn(10);final EmployeeService employeeService = new EmployeeService();int count = employeeService.getEmployeeCount();assertEquals(10, count); }
  • 無返回值
@Test public void testCreateEmployeeWithMock() {PowerMockito.mockStatic(EmployeeUtils.class);Employee employee = new Employee();PowerMockito.doNothing().when(EmployeeUtils.class);final EmployeeService employeeService = new EmployeeService();employeeService.createEmployee(employee);PowerMockito.verifyStatic(); }

mock final class / method

同上

mock constructors

  • 有參構造
    whenNew(EmployeeDao.class).withArguments(false, MYSQL).thenReturn(employeeDao);

參數匹配器
包含請求和回答參數,還是參考這里
mockito官網文檔
PowerMockito.when(employeeService.xxx).then(new Answer() {
@override
public String answer(InvocationOnMock invocation) throws Throwable {
…分支
}
})

spy:只mock 一個對象的個別方法行為,保留對某些方法原始的業務邏輯

mock private methods

public class EmployeeService {private void checkExist(String userName) {throw new UnsupportedOperationException();} } PowerMockito.doNothing().when(employeeService, "checkExist", "wangwenjun");employeeService.checkExist("wangwenjun");PowerMockito.verifyPrivate(employeeService).invoke("checkExist","wan gwenjun");

總結

以上是生活随笔為你收集整理的《PowerMock实战手册》读书笔记及个人总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。