JUnit Mockito 單元測試

2021-07-13 10:42:57 字數 2962 閱讀 3413

junit 是單元測試框架。mockito 與 junit 不同,並不是單元測試框架(這方面 junit 已經足夠好了),它是用於生成模擬物件或者直接點說,就是」假物件「的工具。乙個典型的例子就是使用模擬物件來模擬資料庫dao層。在生產環境上是使用執行的資料庫,但是在單元測試環境中完全可以用模擬物件來模擬資料,確保單元測試的正確條件。這樣就不需要依賴於外部的資料。一般通常的做法就是聯合 junit + mockito 來進行測試。

首先是配置 mock 物件,

list mock = mock( list.class );

when( mock.get(0) ).thenreturn( 1 );

assertequals( "預期返回1", 1, mock.get( 0 ) );

再例如,假設我們沒有 tomcat(雖然不太可能,假設吧!),使用 mockito 模擬乙個:

when(request.getparameter("a")).thenreturn("aaa");其中 request 是模擬 httpservletrequest 的物件,擁有 httpservletrequest 的所有方法和屬性。when(***x).thenreturn(yyyy); 是指定當執行了這個方法的時候,返回 thenreturn 的值,相當於是對模擬物件的配置過程,為某些條件給定乙個預期的返回值。相信通過這個簡單的例子你可以明白所謂 mock 便是這麼一回事。

這裡就是" stub 打樁"的概念了,所謂打樁,就是把所需的測試資料,適用於基於狀態的(state-based)測試,關注的是輸入和輸出。

對方法設定返回異常,需指定型別,參見 這裡 。

when(i.next()).thenthrow(new runtimeexception());
mockito支援 迭代風格 的返回值設定,

上面的例子等價於:

when(i.next()).thenreturn("hello");

when(i.next()).thenreturn("world");

第一次呼叫i.next()將返回」hello」,第二次的呼叫會返回」world」。

對 void 方法不返回值,所以不能 when(mock.somemethod()).thenreturn(value) 這樣的語法,可以這樣

donothing().when(i).remove();

dothrow(throwable) 模擬返回異常

dothrow(new runtimeexception()).when(i).remove();

迭代風格 donothing().dothrow(new runtimeexception()).when(i).remove();,這樣,第一次呼叫remove方法什麼都不做,第二次呼叫丟擲runtimeexception異常。

模擬引數argument matchers

這個比較方便,anyint() 匹配任何 int 引數,這意味著引數為任意值,其返回值均是 element  

when(mockedlist.get(anyint())).thenreturn("element");   

system.out.println(mockedlist.get(999));// 此時列印是element

若方法中的某乙個引數使用了matcher,則所有的引數都必須使用 matcher。

自定義型別也可以,參加 這裡 。

就實話說,我剛接觸也不是太明白,參見 《用mockito的verify來驗證mock的方法是否被呼叫》 :

看mockito的api時,一直都不清楚veriry()這個方法的作用,因為如果我mock了某個方法,肯定是為了呼叫的啊。直到今天在回歸介面測試用例的時候,發現有兩個用例,用例2比用例1多了乙個 mock 的步驟,不過最後的結果輸出是一樣的。由於**做了修改,我重新 mock 後,其實用例2中對於的步驟是不會執行的,可測試還是通過了。仔細檢視後,發現mock的方法沒有被呼叫,所以用例2和用例1就變成一樣的了。於是,就產生了這麼個需求:單單通過結果來判斷正確與否還是不夠的,我還要判斷是否按我指定的路徑執行的用例。到這裡,終於領略到了mockito的verify的強大威力,以下是示例**:

若呼叫成功,則程式正常執行,反之則會報告: wanted but not invoked:verify(mockedlist).add("one"); 錯誤。

using mocks

mockedlist.add("one");

mockedlist.add("two");

verify(mockedlist).add("one"); // 注意,如果times不傳入,則預設是1

據說是 mockito 跟蹤了所有的方法呼叫和引數的呼叫情況。verify() 可以驗證方法的行為。檢視另外乙個的例子:

@test

public

void testmap()

更多驗證的例子參見 這裡 。

如果沒有 junit,可以使用 mockito 的 @before 的註解,進行一些前期的初始化工作,

public

class

articlemanagertest

}

如果有 junit,則無需 @before,但要修改 junit 預設容器,

@runwith(mockitojunitrunner.class)

public

class

exampletest

}

在 junit 中有很多個 runner ,他們負責呼叫你的測試**,每乙個 runner 都有各自的特殊功能,你要根據需要選擇不同的 runner 來執行你的測試**。

unittest單元測框架

django預設使用python的標準庫unittest編寫測試用例。學習django單元測試之前,先學習下unittest單元測試框架的基本使用。下面實現乙個簡單的單元測試1.簡單的加法和減法功能實現,module.py 如下 encoding utf 8 class calculator doc...

單元測試應該測什麼

單元測試應該全面覆蓋專案開發的 但是依賴的第三方 不應該被測試。凡是非本專案開發的 都可以認為是第三方 比如,我們專案依賴別的部門提供的儲存服務,連線此服務需要使用他們提供的乙個指令碼,而這個指令碼存放在我們的util目錄中。像這個指令碼,就是所謂的第三方 我用下面這段話來說服領導將這個指令碼從測試...

使用Spring配合Junit進行單元測試的總結

最近公司的專案和自己的專案中都用到了spring整合 junit進行 單元測試,總結一下幾種基本的用法 1.直接對spring中注入的bean進行測試 以dao為例 在測試類上新增 runwith註解指定使用springjunit的測試執行器,contextconfiguration註解指定測試用的...