單元測試中PowerMock常用方法

2021-05-26 16:04:11 字數 1756 閱讀 2675

在進行單元測試時,為了測試乙個簡單的方法,往往需要構造一堆複雜的相當物件,還有的情況是有的方法沒有返回值,直接在函式內做了某些事情,這時如果用黑盒測試,你無法通過輸入輸出判斷方法是否正確。所以,通常都會通過mock物件的方法來進行unit test. 有機會再總結軟體測試一些理論知識,今天先把這幾天寫unit test中常用的powermock使用方法寫一下(所有例子都是直接在網頁內敲出來的,不能直接執行)。

1. mock 乙個測試時不方便建立的物件,並設定public方法的預期行為。

例如mediamanager類中的方法:

public int getsystemvolume()

其中的context物件是平台相關的,在測試程式中根本無法建立些context的物件,在測試時我認為只要程式能去執行平台相關的這個物件的這個方法,這個方法就是正確的。

測試如下

@runwith(powermockrunner.class)

@preparefortest(mediamanager.class)

public class mediamanagertest

@test

public void testgetsystemvolume()

2.mock 靜態的方法.

如果對乙個mock物件的靜態方法進行預期設定,還需要做一些工作才能實現(1)在preparefortest裡新增此方法的類名.(2)在mock靜態方法前宣告powermock.mockstatic(class.class),

如果上例中的context的setaudioenable為靜態方法,測試程式如下:

@runwith(powermockrunner.class)

@preparefortest()

public class mediamanagertest

, 20);

因為camera是裝置相關的,在測試環境內無法建立此種型別物件,而此時又無法自己mock乙個camera傳進來,所以只能在它 new camera()時給它替換乙個自己mock的物件,這種情況可以用powermock.expectnew()來實現。針對上面**可以用如下實現mock:

camera   camera = powermock.createmock(camera.class); //先mock出乙個用於替換的物件

powermock.expectnew(camera.class, easymock.anyint()).andreturn(camera );

camera.open(easymock.anyobject(string.class));  //此處表示檢驗程式時open()方法中傳入的只要是string類物件

//就滿足條件,對具體物件不敏感

camera.setfilename(easymock.aryeq(new string), easymock.eq(20) );

上面的easymock.anyint()表示無論被測試方法中的new camera()中實際傳的引數是什麼值,只要是個int值,都滿足被mock物件替換掉的條件,使用easymock.anyobject(class.class),可以匹配類型別,這樣可以使檢驗時不用指定嚴格的引數值。

上面對setfilename()進行mock時,直接new 乙個同樣的string陣列傳進去,並不能通過驗證,因為陣列的內容相等但它的值不相等,所以你傳的值和它預期的值不相同,故通不過測試,而easymock.aryeq(new string則可以通過驗證,驗證時它會驗證陣列內容而不陣列物件本身。需要注意的是如果方法有多個引數,其中乙個使用了這種匹配的驗證方法,其它的也得使用匹配驗證方法。

PowerMock單元測試案例

引入如下的mock jar包 org.mockito mockito core 2.23.0 test org.powermock powermock module junit4 2.0.0 rc.3 test org.powermock powermock api mockito2 2.0.0 r...

單元測試 單元測試文章收藏

前言 前段時間公司計畫做自動化測試,自己也打算圍繞幾個點做相關調研,現在想想呢?其實對自動化測試的概念都還不是十分清晰,當時主要還是圍繞 單元測試 向qa小夥伴學習了一段時間,現由於公司重組,學習中斷,這裡簡單記錄一些單元測試好文,留待後續參考.什麼叫自動化測試?自動化測試覆蓋率?覆蓋率如何做到的?...

單元測試之Django單元測試

每個應用,自帶tests.py 整合在django的專案檔案裡,更多是開發人員寫django自動的測試執行 3.1 前後置方法執行特點 django.test.testcase類主要由前 後置處理方法和test開頭的方法組成 特點 繼承於django.test.testcase 測試用例都是test...