學(xué)習(xí)Mockito框架
Mockito是一個流行的Mocking框架。它使用起來簡單,學(xué)習(xí)成本很低,而且具有非常簡潔的API,測試代碼的可讀性很高。因此它十分受歡迎,用戶群越來越多,很多的開源的軟件也選擇了Mockito。要想了解更多有關(guān)Mockito的信息,請訪問它的官方網(wǎng)站:http://mockito.org/
在開始使用Mockito之前,先簡單的了解一下Stub和Mock的區(qū)別。
Stub對象用來提供測試時所需要的測試數(shù)據(jù),可以對各種交互設(shè)置相應(yīng)的回應(yīng)。例如我們可以設(shè)置方法調(diào)用的返回值等等。Mockito中 when(…).thenReturn(…) 這樣的語法便是設(shè)置方法調(diào)用的返回值。另外也可以設(shè)置方法在何時調(diào)用會拋異常等。Mock對象用來驗證測試中所依賴對象間的交互是否能夠達(dá)到預(yù)期。 Mockito中用 verify(…).methodXxx(…) 語法來驗證 methodXxx方法是否按照預(yù)期進(jìn)行了調(diào)用。有關(guān)stub和mock的詳細(xì)論述見,Martin Fowler文章《Mocks Aren't Stub》http://martinfowler.com/articles/mocksArentStubs.html。在Mocking框架中所謂的mock對象實際上是作為上述的stub和mock對象同時使用的。因為它既可以設(shè)置方法調(diào)用返回值,又可以驗證方法的調(diào)用。
Mockito的獲取
Jar包的獲取
可以訪問下面的鏈接來下載最新的Jar包,筆者使用的當(dāng)前最新版為:1.8.5 http://code.google.com/p/mockito/downloads/list
Maven
如果項目是通過Maven管理的,需要在項目的Pom.xml中增加如下的依賴:
Java代碼
org.mockito mockito-all 1.8 . 5 test
Java代碼
org.mockito mockito-all 1.8.5 test
Mocktio包的引入
在程序中可以import org.mockito.Mockito;然后調(diào)用它的static方法,或者import static org.mockito.Mockito.*;個人傾向于后者,因為這樣可以更方便些。
一個簡單的例子
Java代碼
- import static org.junit.Assert.*;
- import static org.mockito.Mockito.*;
- import java.util.Iterator;
- import org.junit.Test;
- /**
- *
- * @author Brian Zhao
- */
- public class SimpleTest {
- @Test
- public void simpleTest(){
- //arrange
- Iterator i=mock(Iterator.class );
- when(i.next()).thenReturn("Hello" ).thenReturn( "World" );
- //act
- String result=i.next()+" " +i.next();
- //verify
- verify(i, times(2 )).next();
- //assert
- assertEquals("Hello World" , result);
- }
- }
Java代碼
- import static org.junit.Assert.*;
- import static org.mockito.Mockito.*;
- import java.util.Iterator;
- import org.junit.Test;
- /**
- *
- * @author Brian Zhao
- */
- public class SimpleTest {
- @Test
- public void simpleTest(){
- //arrange
- Iterator i=mock(Iterator.class);
- when(i.next()).thenReturn("Hello").thenReturn("World");
- //act
- String result=i.next()+" "+i.next();
- //verify
- verify(i, times(2)).next();
- //assert
- assertEquals("Hello World", result);
- }
- }
在上面的例子中包含了Mockito的基本功能:
創(chuàng)建Mock對象
創(chuàng)建Mock對象的語法為,mock(class or interface)。例子中創(chuàng)建了Iterator接口的mock對象。
設(shè)置方法調(diào)用的預(yù)期返回
通過when(mock.someMethod()).thenReturn(value) 來設(shè)定mock對象某個方法調(diào)用時的返回值。例子中我們對Iterator接口的next()方法調(diào)用進(jìn)行了預(yù)期設(shè)定,當(dāng)調(diào)用next()方法時會返回”Hello”,由于連續(xù)設(shè)定了返回值,因此當(dāng)?shù)诙握{(diào)用時將返回”World”。
驗證方法調(diào)用
接下來對mock對象的next()方法進(jìn)行了一系列實際的調(diào)用。mock對象一旦建立便會自動記錄自己的交互行為,所以我們可以有選擇的對它的交互行為進(jìn)行驗證。在Mockito中驗證mock對象交互行為的方法是verify(mock).someMethod(…)。于是用此方法驗證了 next()方法調(diào)用,因為調(diào)用了兩次,所以在verify中我們指定了times參數(shù)(times的具體應(yīng)用在后面會繼續(xù)介紹)。最后assert返回值是否和預(yù)期一樣。
原文鏈接:http://javasee.iteye.com/blog/1000868
【編輯推薦】