使用Powermock工具mock系統類(java.util.Date的構造方法)

場景

示例,有如下DateFormat的formatCurrentTime()方法,代碼如下:

public class DateFormat {

    public static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyMMddHHmmssZ");

    public static String formatCurrentTime() {
        return SIMPLE_DATE_FORMAT.format(new Date());
    }
}

我現在期望判斷formatCurrentTime方法返回的值是否是SIMPLE_DATE_FORMAT對象格式化的值(當然了,這代碼一看肯定是了,不要覺得這沒意義,實際工作中真的有類似無聊而又什麼什麼的需求)。

爲了滿足這個要求,我只需要判斷SIMPLE_DATE_FORMAT.format(new Date())是否等於DateFormat.formatCurrnetTime()方法調用的返回值就行了。但是很明顯,formatCurrnetTime方法內部調用SIMPLE_DATE_FORMAT.format方法時傳入的參數直接new了一個Date對象,我外部顯式調用SIMPLE_DATE_FORMAT.format方法的時候又再創建的Date對象肯定不是這一個了,所以我需要mock java.util.Date類的無參構造方法,保證每次new的時候返回的是同一個對象。

測試代碼如下:

實現

@RunWith(PowerMockRunner.class)
@PrepareForTest(Date.class)
public class DateFormatTest {

    @Before
    public void setup() {
        PowerMockito.mockStatic(Date.class);
    }

    @Test
    public void testFormatCurrentTime() throws Exception {
        Date date = new Date();
        PowerMockito.whenNew(Date.class).withNoArguments().thenReturn(date);
        Assert.assertEquals(DateFormat.SIMPLE_DATE_FORMAT.format(date), DateFormat.formatCurrentTime());
    }
}

如上代碼,只需要mock Date類的無參構造方法就行:

說明下對於java.util.Date類這種JDK的類的mock操作過程,這裏使用Powermock,關於Powermock的配置可以看Mockito配合powermock工具mock構造函數這篇文章。

步驟如下:

1. 測試類上使用註解@RunWith(PowerMockRunner.class)

2. 註解@PrepareForTest聲明需要處理的類:java.util.Date

3. 調用mockStatic方法mock Date類(調用PowerMockito的mock方法也可以,畢竟這裏需求只是mock 構造方法,我使用mockStatic,是因爲看了它的維基上的介紹,地址在這:https://github.com/powermock/powermock/wiki/Mock-System)。

最後根據這裏的需要設置Date的無參構造方法的期望返回值,mock構造方法的api使用可以看Mockito配合powermock工具mock構造函數這篇文章瞭解下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章