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