場景
示例,有如下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構造函數這篇文章瞭解下。