首先, 在我們學習Mockito之前,我們需要區分幾個概念,這幾個概念對於我們接下來使用Mockito至關重要,只有理清了這幾個概念,在我們使用Mockito接口以及進行解說的時候纔不會覺得莫名。
檢測方式
首先我們需要介紹的是檢測的方式。我們寫單元測試,以及使用Mockito都是爲了檢驗我們的代碼是否按照我們預期的那樣運行。一般來說,有以下兩種檢測方式:
狀態檢測(state verification):方法運行之後,通過檢測方法的狀態(或者說返回值)進行判斷方法是否運行成功。參照以下示例。
call user_id = user_registeration
verify user_id == "123456"
行爲檢測(behavior verification):方法運行之後,通過檢測方法的執行行爲(或者說執行順序)進行判斷方法是否運行成功。參照以下示例。
call user_registeration
verify during user_registeration, write_to_database is called
替換對象
其次,這裏介紹的是在mock對象時會使用到的不同的替換對象,主要有以下兩種:
樁(stub):模擬一個Object,當輸入特定值的時候,返回hard code的指定值,並不真正執行邏輯,類似於複寫(override)了該方法,在複寫的方法中不執行任何邏輯只返回了特定值。多使用於state verification。
例子:假設sum(List<Long> longs)方法對一系列的數進行求和,由於數值比較大可能需要10分鐘(。。。這得多大的數據啊,但是假設如此),在進行Unit Test的時候,我們並不會真正的等10分,而是假設我們提供一個特定的序列,sum方法會返回特定的值,中間的執行邏輯被捨棄了。類似於sum(Arrays.asList(1,2,3)){return 6;},其中的邏輯被捨棄了。
模擬對象(mock):同樣是模擬一個Object,相比於stub,mock更關心對象的期望行爲,然後驗證期望的行爲是否發生,也就是說,在測試時,並不關心方法具體返回了什麼,只關心某些特定的方法被使用到了,因此更常用於behavior verification中。對於驗證void返回值的場景,mock就有了獨到的優勢。
例子:假設測試一個下單(order)操作,在調用order()方法後,calculateSumOfAllStuffPrice()應該要被調用,但是並不關心這個方法的返回值。
此文同步發佈到Wordpress