環境準備

在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

1.png

加入以後以後只要有用到Mockito, Matcher他都會顯示如下畫面,就可以很輕鬆地將你需要的東西import進來,很方便!

2.png

 

測試情境

今天我有一個資料管理者(DataManager)他負責管理資料,

這個DataManager會透過FileUtil去建立資料夾,

DataManager.png

而這個FilUtil的createFolder是一個靜態方法(Static method)

FilUtil.png

 

該怎麼測試呢?

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的程式

3.png

接著我們就可以寫單元測試了

4.png

一開始先用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

 

arrow
arrow

    Mark Zhang 發表在 痞客邦 留言(0) 人氣()