環境準備
在Maven Project中可以在pom.xml中加入dependency:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
有了這些dependency就可以使用power mock, mockito, argument matcher了
另外也可以在eclipse中設定讓mockito, argument matcher加入靜態成員
在Windows > Preference > Java > Editor > Content Assist > Favorites > New Type...
分別加入org.mockito.Mockito, 和 org.mockito.Matchers
加入以後以後只要有用到Mockito, Matcher他都會顯示如下畫面,就可以很輕鬆地將你需要的東西import進來,很方便!
測試情境
今天我有一個資料管理者(DataManager)他負責管理資料,
這個DataManager會透過FileUtil去建立資料夾,
而這個FilUtil的createFolder是一個靜態方法(Static method)
該怎麼測試呢?
DataManager是我們的待測程式(SUT), 而FileUtil則是實作細節,對於驗證SUT來說不需要去管第三方的實作細節
因為我們沒有要做整合測試(IT),只是做單元測試,
所以我們只需要把FileUtil mock起來,去驗證我們的SUT有call FileUtil的createFolder一次即可
而對於createFolder這個行為到底正不正確其實我們不在乎,這應該是交由其他測試去驗證就可以了
但重點是FileUtil的createFolder是一個static method,普通的Mockito無法mock它
所以我們只好借重PowerMock了
首先,使用PowerMock前,必須先在測試上方加上兩行註釋:
@RunWith(PowerMockRunner.class)
@PrepareForTest({FileUtil.class})
第二行是標示出你要PowerMock的程式
接著我們就可以寫單元測試了
一開始先用mockStatic去mock FileUtil (如果只想要partial mock method的話,把mockStatic改成spy即可)
接著宣告createFolder的行為,這邊我們是讓它回傳一個假的File
(如果要mock的那個行為沒有return值的話,也可以讓它doNothing() )
準備好mock以後,當我們呼叫DataManager的addNewFolder後
我們就可以去驗證DataManager有沒有呼叫FileUtil的createFolder一次
Ref:
[1] https://www.baeldung.com/intro-to-powermock
[2] https://mvnrepository.com/artifact/org.mockito/mockito-all/1.3
[3] https://tonylin.idv.tw/dokuwiki/doku.php/java:junit:powermockito:mockpartial
留言列表