Mockito編寫單元測試

Mock是常用的單元測試工具之一,Mockito是Mock工具的一種,能解決現實應用中,絕大部分的場景應用。。

Mockito簡單應用的環境準備

使用的項目爲Maven Project,使用的測試工具爲TestNg,過程中全部使用Mock註解方式。

<!-- Mockito -->
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-all</artifactId>
  <version>1.9.5</version>
</dependency>
<!– TestNg -->
<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>6.8.13</version>
</dependency>

@Mock與@Spy

  • @Mock對象:對象生成時不會執行任何構造器方法,方法調用時,不執行方法中的任何內容,返回原始默認值。
  • @Spy對象:對象生成時執行構造器方法,方法調用時,執行方法中的任何內容。

重要:使用Mock註解時,對象初始化之前,一定要先執行 MockitoAnnotations.initMocks(this); 方法,使用TestNg時,可以放到@BeforeClass中
提示:Spy對象本質上是Mock對象,它實際上是Mock對象的一種特殊形式

@InjectMocks

@InjectMocks對象:對象生成時會執行構造器方法,如果有多個構造器,則會選擇參數最多的構造方法,對象中的屬性和屬性的Setter方法會被Mock對象(包括@Spy)注入,方法調用時,執行方法中的任何內容。

提示:當InjectMocks對象既有屬性又有屬性的Setter方法時,這個Setter方法會被執行兩次,換句話說,對於屬性的注入,其實也是在調用set方法。

Stub(樁)

Stub(樁)表達的一種當假設的情況發生時要做什麼的情況設置。
Stub的表達式有兩種,一種是when…then…,另一種是do…when…,兩種所表達的意思是一樣的,然而也有不同之處:
1、使用when…then…的時候,spy對象的方法會被執行一次,而使用do…when…則不會
2、部分do…when…能適用void方法,而when…then…則沒有

提示:Mock對象被打樁後就不會再執行了
提示:Injectmocks對象不能被打樁
提示:推薦使用do…when…方式

Stub(樁)-具有返回值的方法

when…thenReturn…
doReturn…when…

Stub(樁)-void方法

Stub針對void方法只有3個選擇:執行方法、什麼都不做、拋異常
doCallRealMethod…when…
doNothing…when…
doThow…when…

提示:這幾個同樣適用於具有返回值的方法

驗證

驗證 verfiy,用於驗證Mock對象的執行情況
verify(mock).method()
verify(mock, times(1)).method()
verify(mock, atLeastOnce()).method()
verify(mock, atLeast(1)).method()
verify(mock, atMost(1)).method()
verify(mock, never()).method()

提示:verify(mock).method()等同於verify(mock, times(1)).method()
提示:InjectMocks對象不能被驗證

獲取參數

對於一些含有參數的void方法,如果參數是個引用對象,並且在void方法中進行了修改,出於某種目的,我們需要獲得這個經過修改的參數對象,該怎麼辦呢?
Mockito提供了ArgumentCaptor類用於進行參數獲取。

演示代碼

Soldier.java
Weapon.java
Bullet.java
BaseTester.java
TestMockAndSpy.java
TestInjectMocks.java
TestStubForReturnMethod.java
TestVerify.java
TestArgumentCaptor.java

代碼說明:此部分代碼均爲在分享過程中編寫的代碼,其中士兵、武器、子彈類爲測試 對象,其餘爲測試類

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 9824
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章