天天看點

Mockito教程

https://www.cnblogs.com/Ming8006/p/6297333.html

目錄

1 Mockito 介紹 

  1.1 Mockito是什麼?

  1.2 為什麼需要Mock

  1.3 Stub和Mock異同

  1.4 Mockito資源

  1.5 使用場景

2 使用Mockito 

  2.1 驗證行為

  2.2 模拟我們所期望的結果

  2.3 RETURNS_SMART_NULLS和RETURNS_DEEP_STUBS

  2.4 模拟方法體抛出異常

  2.5 使用注解來快速模拟 

  2.6 參數比對

  2.7 自定義參數比對

  2.8 捕獲參數來進一步斷言

  2.9 使用方法預期回調接口生成期望值(Answer結構)

  2.10 修改對未預設的調用傳回預設期望

  2.11 用spy監控真實對象  

  2.12 真實的部分mock

  2.13 重置mock

  2.14 驗證确切的調用次數

  2.15 連續調用

  2.16 驗證執行順序

  2.17 確定模拟對象上無互動發生

  2.18 找出備援的互動(即未被驗證到的)

3 Mockito如何實作Mock

參考 

 傳回

Mockito是mocking架構,它讓你用簡潔的API做測試。而且Mockito簡單易學,它可讀性強和驗證文法簡潔。

測試驅動的開發( TDD)要求我們先寫單元測試,再寫實作代碼。在寫單元測試的過程中,我們往往會遇到要測試的類有很多依賴,這些依賴的類/對象/資源又有别的依賴,進而形成一個大的依賴樹,要在單元測試的環境中完整地建構這樣的依賴,是一件很困難的事情。如下圖所示: 

Mockito教程

為了測試類A,我們需要Mock B類和C類(用虛拟對象來代替)如下圖所示:

Mockito教程

相同:Stub和Mock都是模拟外部依賴

不同:Stub是完全模拟一個外部依賴, 而Mock還可以用來判斷測試通過還是失敗 

官網: http://mockito.org

API文檔:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html

項目源碼:https://github.com/mockito/mockito 

提前建立測試; TDD(測試驅動開發)

團隊可以并行工作

你可以建立一個驗證或者示範程式

為無法通路的資源編寫測試

Mock 可以交給使用者

隔離系統  

添加maven依賴

添加junit依賴

添加引用

Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程

RETURNS_SMART_NULLS實作了Answer接口的對象,它是建立mock對象時的一個可選參數,mock(Class,Answer)。

在建立mock對象時,有的方法我們沒有進行stubbing,是以調用時會放回Null這樣在進行操作是很可能抛出NullPointerException。如果通過RETURNS_SMART_NULLS參數建立的mock對象在沒有調用stubbed方法時會傳回SmartNull。例如:傳回類型是String,會傳回"";是int,會傳回0;是List,會傳回空的List。另外,在控制台視窗中可以看到SmartNull的友好提示。

Mockito教程
Mockito教程

RETURNS_DEEP_STUBS也是建立mock對象時的備選參數

RETURNS_DEEP_STUBS參數程式會自動進行mock所需的對象,方法deepstubsTest和deepstubsTest2是等價的

Mockito教程
Mockito教程

在上面的測試中我們在每個測試方法裡都mock了一個List對象,為了避免重複的mock,是測試類更具有可讀性,我們可以使用下面的注解方式來快速模拟對象:

OK,我們再用注解的mock對象試試 

運作這個測試類你會發現報錯了,mock的對象為NULL,為此我們必須在基類中添加初始化mock的代碼

Mockito教程
Mockito教程

或者使用built-in runner:MockitoJUnitRunner

Mockito教程
Mockito教程
Mockito教程
Mockito教程

除了比對制定參數外,還可以比對自己想要的任意參數

Mockito教程
Mockito教程

注意:如果你使用了參數比對,那麼所有的參數都必須通過matchers來比對,如下代碼:

Mockito教程
Mockito教程
Mockito教程
Mockito教程

較複雜的參數比對器會降低代碼的可讀性,有些地方使用參數捕獲器更加合适。

Mockito教程
Mockito教程
Mockito教程
Mockito教程

也可使用匿名内部類實作

Mockito教程
Mockito教程
Mockito教程
Mockito教程

Mock不是真實的對象,它隻是用類型的class建立了一個虛拟對象,并可以設定對象行為

Spy是一個真實的對象,但它可以設定對象行為

InjectMocks建立這個類的對象并自動将标記@Mock、@Spy等注解的屬性值注入到這個中

Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程
Mockito教程

Mockito并不是建立一個真實的對象,而是模拟這個對象,他用簡單的when(mock.method(params)).thenRetrun(result)語句設定mock對象的行為,如下語句:

在Mock對象的時候,建立一個proxy對象,儲存被調用的方法名(get),以及調用時候傳遞的參數(0),然後在調用thenReturn方法時再把“first”儲存起來,這樣,就有了建構一個stub方法所需的所有資訊,建構一個stub。當get方法被調用的時候,實際上調用的是之前儲存的proxy對象的get方法,傳回之前儲存的資料。

[1] 單元測試之Stub和Mock

[2] mockito簡單教程

[3] Mockito入門

[4] 學習Mockito

分類: 白盒測試,測試架構

繼續閱讀